programing

Laravel 상위 행을 삭제하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패함

bestprogram 2023. 10. 14. 10:23

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