我正在构建一些东西,允许用户上传他们的图形作品,其他用户可以对项目发表评论,也可以像其他项目一样。
现在,当用户想要删除他们自己的项目时,它可以工作,但一旦项目有评论或点赞,我就会收到这个错误:
Integrity constraint violation: 1451
Cannot delete or update a parent row: a foreign key constraint fails
(`scotchbox`.`comments`, CONSTRAINT `comments_on_projects_foreign` FOREIGN KEY (`on_projects`)
REFERENCES `projects` (`id`)) (SQL: delete from `projects`
where `id` = 31 and `user_id` = 32)
我想这可以通过删除评论表中的评论和点赞表中的点赞来解决?但老实说,我不知道如何用外键解决这个问题。
我想在删除项目本身之前,我需要一种方法来删除项目的评论和点赞。这可能来自我的ProjectsController的销毁功能吗
这是我删除项目的销毁功能:
public function destroy($id)
{
$input = Request::all();
Project::whereId($id)->whereUserId(Auth::user()->id)->delete();
return redirect('projects/');
}
当您有外键时,您可以选择删除行为。
你有:用户,项目
用户有许多项目
因此,这意味着在Projects模式中,您将拥有类似于此的内容
Schema::create('projects', function(Blueprint $table){
// table fields
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});
在这种情况下,如果在父级(User)上发生删除,您已经建立了一个关系,但没有说明"如何操作",这意味着如果您试图删除用户,则会抛出查询异常来保护您。
因此,如果是这种情况,您必须找到该父级(User)的所有子级(Projects。
第二个解决方案是添加onDelete()行为:
Schema::create('projects', function(Blueprint $table){
// table fields
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
这意味着,如果您删除父项(用户),它将自动找到所有子项(项目 最后,请注意,我使用亲子类比来澄清这种情况,这种类比只适用于一对多关系。 当你被数据库主义者包围时,请避免使用这种类比,以保护自己免受进一步的后果。
您试图删除的用户对项目发表了评论。删除用户之前先删除他的评论。或者对您试图删除的项目有评论。
通过在我的迁移中添加onDelete('cascade')来修复它,如下所示:
评论迁移:
$table->foreign('on_projects')->references('id')->on('projects')->on Delete('cascade');
喜欢迁移:
$table->foreign('project_id')->references('id')->on('projects')->on Delete('cascade');