I am using PHP 8.2.0, MySQL 8.2.0, and Laravel 9.48.0. This is my database migrations file pivot table (category_menu):
public function up()
{
Schema::create('category_menu', function (Blueprint $table) {
$table->foreignId('category_id')->constrained();
$table->foreignId('menu_id')->constrained();
});
}
This is the CategoryController.php:
public function destroy(Category $category)
{
Storage::delete($category->image);
$category->menus()->delete(); // many-to-many relationship
$category->delete();
return to_route('admin.categories.index');
}
Lastly, this is the MenuController.php:
public function destroy(Menu $menu)
{
Storage::delete($menu->image);
$menu->categories()->delete(); // many-to-many relationship
$menu->delete();
return to_route('admin.menus.index');
}
I have tried deleting one of the menu/category, but laravel keeps sending out an error:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
larareserve
.category_menu
, CONSTRAINTcategory_menu_menu_id_foreign
FOREIGN KEY (menu_id
) REFERENCESmenus
(id
))
delete `menus` from `menus` inner join `category_menu` on `menus`.`id` = `category_menu`.`menu_id` where `category_menu`.`category_id` = 4
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
larareserve
.category_menu
, CONSTRAINTcategory_menu_category_id_foreign
FOREIGN KEY (category_id
) REFERENCEScategories
(id
))
delete `categories` from `categories` inner join `category_menu` on `categories`.`id` = `category_menu`.`category_id` where `category_menu`.`menu_id` = 7
I thought, this error might have to do with the migration's pivot table (category_menu). But, I just don't know how to fix this. I am currently one month old learning the laravel framework and right now, I am working on the tutorial project from youtube. Please help (educate) me anyone. I am sorry for all inconveniences.
CodePudding user response:
Alright. Already got the solution from Laravel Cannot delete or update a parent row: a foreign key constraint fails
so what I did was, in my database migrations file pivot table (category_menu):
public function up()
{
Schema::create('category_menu', function (Blueprint $table) {
$table->foreignId('category_id')->constrained();
$table->foreignId('menu_id')->constrained()->onDelete('cascade');
});
}
CategoryController.php:
public function destroy(Category $category)
{
Storage::delete($category->image);
$category->menus()->delete(); // many-to-many relationship
$category->delete();
return to_route('admin.categories.index');
}
MenuController.php:
public function destroy(Menu $menu)
{
Storage::delete($menu->image);
//$menu->categories()->delete(); // many-to-many relationship
$menu->delete();
return to_route('admin.menus.index');
}
By adding ->onDelete('cascade')
on the migration file, I can already delete the menu. I also put the syntax only on the menu item in the migration file and commented the line to delete the menu's category method on the MenuController, so that whenever I deleted the menu, the category won't be deleted. If I deleted the category, the menu related to it will also be deleted.
CodePudding user response:
This is yet another solution for another type of outcome. Let say, whenever I want to delete the menu, only the menu gets deleted. And whenever I want to delete the category, only the category gets deleted.
Migration File (category_menu):
public function up()
{
Schema::create('category_menu', function (Blueprint $table) {
$table->foreignId('category_id')->constrained()->onDelete('cascade');
$table->foreignId('menu_id')->constrained()->onDelete('cascade');
});
}
CategoryController.php:
public function destroy(Category $category)
{
Storage::delete($category->image);
// $category->menus()->delete(); // many-to-many relationship
$category->delete();
return to_route('admin.categories.index');
}
MenuController.php:
public function destroy(Menu $menu)
{
Storage::delete($menu->image);
// $menu->categories()->delete(); // many-to-many relationship
$menu->delete();
return to_route('admin.menus.index');
}