【问题标题】:Laravel 5.1 QueryException when trying to delete a project尝试删除项目时 Laravel 5.1 QueryException
【发布时间】:2015-12-15 11:32:38
【问题描述】:

我正在构建一些东西,允许用户上传他们的图形作品,而其他用户可以在项目上进行 cmet 并像其他项目一样。

现在,当用户想要删除他们自己的项目时,它可以工作,但只要项目有 cmets 或 like,我就会收到此错误:

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)

我认为这可以通过从 cmets 表中删除 cmets 以及从 likes 表中删除来解决?但老实说,我不知道如何用外键解决这个问题。

我认为在删除项目本身之前,我需要一种方法来删除项目的 cmets 和 likes。这可能来自我的 ProjectsController 的破坏功能吗?

这是我删除项目的销毁函数:

public function destroy($id)
{
    $input = Request::all();
    Project::whereId($id)->whereUserId(Auth::user()->id)->delete();
    return redirect('projects/');
}

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    当你有外键时,你可以选择删除的行为。

    你有:用户、项目

    用户有很多项目

    这意味着在 Projects 架构中,您将拥有与此类似的内容

     Schema::create('projects', function(Blueprint $table){
        // table fields
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
     });
    

    在这种情况下,如果在父级(用户)上发生删除,您已经建立了关系而没有说“如何表现”,这意味着如果您尝试删除用户,查询异常将被抛出以保护你。

    因此,如果是这种情况,您将必须找到该父级 (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');
     });
    

    这意味着,如果您删除 Parent(User),它会自动找到所有子项(Projects)并为您一一删除。

    最后,请注意,我使用父母子女类比来澄清这种情况,这种类比只适用于一对多关系。

    当您被数据库专家包围时,请避免使用该类比,以保护自己免受进一步的后果。

    【讨论】:

      【解决方案2】:

      您尝试删除的用户对项目发表了评论。在删除用户之前删除他的 cmets。或者您尝试删除的项目有评论。

      【讨论】:

      • 很抱歉,我不确定我是否理解您的意思。我想我需要一种方法来删除项目中的 cmets 之类的。
      • 是的,检查你的外键,你需要删除项目相关的记录才能删除项目。
      • 我是 Laravel 的新手,你能帮忙吗?是否可以使用我的 ProjectsController 中的销毁功能从多个表中删除记录?
      【解决方案3】:

      通过将 onDelete('cascade') 添加到我的迁移中来修复它,如下所示:

      评论迁移:

      $table->foreign('on_projects')->references('id')->on('projects')->onDelete('cascade');

      喜欢迁移:

      $table->foreign('project_id')->references('id')->on('projects')->onDelete('cascade');

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多