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); }
You can drop a foreign key constraint using the following ALTER TABLE syntax: ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol; If the FOREIGN KEY clause defined a CONSTRAINT name when you created the constraint, you can refer to that name to drop the foreign key constraint.
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.
I've tested with onDelete('cascade')
but in my case it didn't work. The resource I tried to delete had a model with an hasMany()
/** * Get the departments of the organization * * @return void */ public function org_departments() { return $this->hasMany(Department::class); }
So, in the destroy()
for the controller OrganizationUserController
, instead of having
$organization->delete();
I ensured to delete the departments for that organization first and only then the $organization
,
$organization->org_departments()->delete(); $organization->delete();
Then it was deleted just fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With