For some reason a user cannot delete a post if it has been liked, it was working before but when I linked posts with likes I have been getting this error, I can’t even delete it in Sequel Pro, unless I delete the likes associated with the post first.
Error
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
eliapi8
.likes
, CONSTRAINTlikes_post_id_foreign
FOREIGN KEY (post_id
) REFERENCESposts
(id
)) (SQL: delete fromposts
whereid
= 149)
Maybe it’s my schema?
Posts Schema
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(); });
Likes Schema
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(); });
I can like and unlike a post, but a user cannot delete a post that has been liked.
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); }
Advertisement
Answer
Yes, it’s your schema. The constraint on likes.post_id
will prevent you from deleting records from the posts
table.
One solution could be using onDelete('cascade')
in the likes
migration file:
Schema::create('likes', function (Blueprint $table) { $table->integer('post_id')->unsigned(); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); });
This way, when a post is deleted, all related likes will be deleted too.
Or, if you have a relationship from the Post model to the Like model, you can $post->likes()->delete()
before deleting the post itself.