Laravel 5.1尝试删除项目时出现QueryException


Laravel 5.1 QueryException when trying to delete a project

我正在构建一些东西,允许用户上传他们的图形作品,其他用户可以对项目发表评论,也可以像其他项目一样。

现在,当用户想要删除他们自己的项目时,它可以工作,但一旦项目有评论或点赞,我就会收到这个错误:

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');