Laravel 상위 행을 삭제하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패함
어떤 이유로 사용자는 게시물이 좋아요를 받은 경우 삭제할 수 없지만 이전에 좋아요를 받은 게시물을 링크했을 때 이 오류가 발생했습니다. 게시물과 관련된 좋아요를 먼저 삭제하지 않으면 Sequel Pro에서 삭제할 수도 없습니다.
오류
SQLSTATE[23000]:무결성 제약 조건 위반: 1451 상위 행을 삭제하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패합니다.
eliapi8
.likes
, 제약 조건likes_post_id_foreign
외부 키(post_id
) 참고문헌posts
(id
)) (SQL: 삭제posts
어디에id
= 149)
내 스키마가 아닐까요?
게시물 스키마
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
좋아요 스키마
Schema::create('likes', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');
$table->foreign('user_id')->references('id')->on('users');
$table->softDeletes();
$table->timestamps();
});
나는 좋아요와 다르게 게시물을 할 수 있지만, 사용자는 좋아요를 받은 게시물을 삭제할 수 없습니다.
PostController.php
public function destroy(Post $post){
$this->authorize('delete', $post);
$postl = Post::with('likes')->whereId($post)->delete();
if ($post->delete()) {
if($postl){
return response()->json(['message' => 'deleted']);
}
};
return response()->json(['error' => 'something went wrong'], 400);
}
네, 스키마에요.제약조건은likes.post_id
당신이 레코드를 삭제하는 것을 막을 것입니다.posts
테이블.
한 가지 해결책은onDelete('cascade')
에서likes
마이그레이션 파일:
Schema::create('likes', function (Blueprint $table) {
$table->integer('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
});
이렇게 하면 게시물이 삭제되면 관련 좋아요도 모두 삭제됩니다.
또는 Post 모델에서 Like 모델로 관계가 있는 경우,$post->likes()->delete()
게시물 자체를 삭제하기 전에.
테스트를 해봤습니다.onDelete('cascade')
하지만 제 경우엔 효과가 없었어요삭제하려고 했던 리소스에 모델이 있습니다.hasMany()
/**
* Get the departments of the organization
*
* @return void
*/
public function org_departments()
{
return $this->hasMany(Department::class);
}
그래서.destroy()
지배인을 위하여OrganizationUserController
, 가지는 대신에
$organization->delete();
나는 먼저 그 조직의 부서들을 삭제하도록 보장했고, 그 후에야$organization
,
$organization->org_departments()->delete();
$organization->delete();
그런 다음에는 잘 삭제되었습니다.
바꾸다on delete
로.cascade
, 대신에restrict
.
만약 당신이 생산 모드에 있다면 그냥 php artisan migration:fresh.모든 테이블이 떨어집니다.
참고: 레코드는 테이블에서 삭제됩니다.
이 문제에 직면한 이유는 무엇입니까?
실제로 하위 테이블에 데이터가 있는 상위 테이블은 삭제할 수 없습니다.먼저 상위 테이블을 삭제할 수 있는 것보다 하위 테이블 데이터만 삭제해야 합니다.
이 문제를 처리할 수 있는 두 가지 옵션이 있습니다.
1)->Migration에서 외국인 키를 사용하여 삭제('cascade')
2) 컨트롤러에 있는 경우 먼저 $organization 삭제 -> org_depart먼트 () -> () 삭제. 따라서 부모 자식 $organization 삭제 -> () 삭제;
언급URL : https://stackoverflow.com/questions/47544109/laravel-cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails
'programing' 카테고리의 다른 글
MariaDB 설치 시 도커 빌드 고착 (0) | 2023.10.14 |
---|---|
요청의 자격 증명 모드가 '포함'인 경우 응답의 헤더는 와일드카드 '*'이 되어서는 안 됩니다. (0) | 2023.10.14 |
오류 2013(HY000):'승인 패킷 읽기'에서 MySQL 서버에 대한 연결이 끊어졌습니다. 시스템 오류: 0 (0) | 2023.10.14 |
가능한 중복된 날짜의 총 길이를 찾기 위해 Oracle 쿼리를 작성하는 방법 (0) | 2023.10.14 |
안드로이드에서 언제 RxJava Observable을 사용해야 하고 언제 간단한 콜백을 사용해야 합니까? (0) | 2023.10.14 |