2017-11-29 8 views
0

何らかの理由で、ユーザーが好きな投稿を削除できない場合は、以前は機能していましたが、私は最初の投稿に関連付けられている好きなものを削除しない限り、私のsequalプロで削除することはできません。Laravel親の行を削除または更新できません:外部キーの制約が適用されません

エラー

SQLSTATE [23000]:整合性制約違反:1451は、親行を削除するか 更新することはできません:外部キー制約は (eliapi8に失敗likes、CONSTRAINT likes_post_id_foreign FOREIGN KEY (post_id)REFERENCES postsid))(SQL:posts id = 149)

から削除

enter image description here

多分私のスキーマですか?

投稿スキーマ

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); 
} 

答えて

1

はい、それはあなたのスキーマです。 likes.post_idの制約により、postsテーブルからレコードを削除できなくなります。

一つの解決策は、likes移行ファイルにonDelete('cascade')を使用することができます

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')->onDelete('cascade'); 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->softDeletes(); 
    $table->timestamps(); 
}); 

この方法でポストが削除された場合、すべての関連同類も削除されます。

また、投稿モデルから類似モデルへの関係がある場合は、投稿自体を削除する前に$post->likes()->delete()とすることができます。

+0

それは働いたので、投稿が好きならonDeleteを使うことができます。 – BARNOWL

+0

なぜ私は 'posts'テーブルからレコードを削除することができなかったのかの答えを更新しました。 – Camilo

+1

私は学ぶのが大好き – BARNOWL

関連する問題