Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Cannot delete or update a parent row: a foreign key constraint fails

Tags:

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, CONSTRAINT likes_post_id_foreign FOREIGN KEY (post_id) REFERENCES posts (id)) (SQL: delete from posts where id = 149)

Sequel Pro on Mac

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); } 
like image 538
BARNOWL Avatar asked Nov 29 '17 02:11

BARNOWL


People also ask

How do I delete a foreign key constraint in mysql?

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.


2 Answers

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.

like image 128
Camilo Avatar answered Oct 10 '22 14:10

Camilo


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.

like image 38
Tiago Martins Peres Avatar answered Oct 10 '22 15:10

Tiago Martins Peres