无法删除或更新父行:Laravel
Posted
技术标签:
【中文标题】无法删除或更新父行:Laravel【英文标题】:Cannot delete or update a parent row: Laravel 【发布时间】:2020-01-10 21:44:31 【问题描述】:我想删除category
表中的一条记录,其中它还将删除具有foreign key
的foreign key
的subcategory
记录。我该怎么做?
另外,解释一下为什么会发生这种情况会有所帮助。谢谢!
控制器
public function destroy(Category $category)
// return $category;
Category::where('id', $category->id)->delete();
Subcategory::where('category_id', $category->id)->delete();
return back();
类别迁移
Schema::create('categories', function (Blueprint $table)
$table->increments('id');
$table->string('name');
$table->timestamps();
);
子类别管理
Schema::create('subcategories', function (Blueprint $table)
$table->bigIncrements('id');
$table->integer('category_id')->unsigned();
$table->string('subcatname');
$table->string('name');
$table->timestamps();
$table->foreign('category_id')->references('id')->on('categories');
);
【问题讨论】:
【参考方案1】:这很简单,因为外键中有默认的delete: Restrict option
。
1.外键添加删除级联选项。当您删除类别记录时,此选项将自动从子类别表中删除任何关联记录。
修改后的 fk 语句如下:
ADD CONSTRAINT `category_subcategory_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE;
或者你可以通过
Laravel 还支持创建外键约束,用于在数据库级别强制引用完整性。例如,让我们在 posts 表上定义一个 user_id 列,它引用 users 表上的 id 列:
Schema::table('posts', function (Blueprint $table)
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
);
您还可以为约束的“on delete”和“on update”属性指定所需的操作:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
【讨论】:
【参考方案2】:您需要onDelete
方法。来自Docs
$table->foreign('category_id')
->references('id')->on('categories')
->onDelete('cascade');
【讨论】:
以上是关于无法删除或更新父行:Laravel的主要内容,如果未能解决你的问题,请参考以下文章
Laravel SQLSTATE[23000] 无法删除或更新父行:外键约束失败