【问题标题】:Laravel Cannot delete or update a parent row: a foreign key constraint failsLaravel 无法删除或更新父行:外键约束失败
【发布时间】:2018-05-12 15:36:04
【问题描述】:

由于某种原因,如果帖子已被点赞,则用户无法删除该帖子,它以前可以使用,但是当我将帖子与点赞链接时,我收到此错误,我什至无法在 Sequel Pro 中删除它,除非我删除与帖子相关的喜欢优先。

错误

SQLSTATE[23000]:违反完整性约束:1451 无法删除或 更新父行:外键约束失败 (eliapi8.likes,约束likes_post_id_foreign外键 (post_id) 参考posts (id)) (SQL: 从posts 中删除 id = 149)

也许这是我的架构?

帖子架构

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->text('body');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->timestamps();
});

喜欢架构

Schema::create('likes', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('post_id')->unsigned();
    $table->integer('user_id')->unsigned();
    $table->foreign('post_id')->references('id')->on('posts');
    $table->foreign('user_id')->references('id')->on('users');
    $table->softDeletes();
    $table->timestamps();
});

我可以点赞和点赞帖子,但用户不能删除已点赞的帖子。

PostController.php

public function destroy(Post $post){

    $this->authorize('delete', $post);
    $postl =  Post::with('likes')->whereId($post)->delete();

    if ($post->delete()) {
        if($postl){
             return response()->json(['message' => 'deleted']);
        }  
    };

    return response()->json(['error' => 'something went wrong'], 400);
}

【问题讨论】:

    标签: mysql laravel


    【解决方案1】:

    on delete 更改为cascade,而不是restrict

    【讨论】:

      【解决方案2】:

      如果您处于生产模式,只需 php artisan migrate:fresh。它将删除所有表
      注意:记录将从表格中删除
      您为什么会遇到这个问题?
      实际上你不能删除在子表中有数据的父表。 首先,您必须删除子表数据才能删除父表

      你有两个选项来处理这个问题。
      1)->onDelete('cascade') 在迁移中使用你的外键
      2) 如果你在控制器中,首先删除 $organization->org_departments()->delete();所以你所有的孩子都会先被删除,然后你才能删除父孩子 $organization->delete();

      【讨论】:

        【解决方案3】:

        是的,这是您的架构。 likes.post_id 的约束将阻止您从 posts 表中删除记录。

        一种解决方案可能是在likes 迁移文件中使用onDelete('cascade')

        Schema::create('likes', function (Blueprint $table) {
            $table->integer('post_id')->unsigned();
            $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
        });
        

        这样,当一个帖子被删除时,所有相关的赞也会被删除。

        或者,如果您有从 Post 模型到 Like 模型的关系,您可以在删除帖子本身之前$post->likes()->delete()

        【讨论】:

        • 它有效,所以如果帖子有喜欢,我可以使用 onDelete。
        • 我更新了为什么无法从 posts 表中删除记录的答案。
        • 我也在我的模式中使用了 ondelete,它不能删除给我同样的错误,当我使用这个 $user->activities()->delete();然后删除用户及其所有数据,但当我简单地使用 $user->delete();它显示错误请帮助。
        • @Moaiz 如果需要,请提出新问题。
        • 你如何“追加” ->onDelete('cascade') 到现有模型?
        【解决方案4】:

        我已经用onDelete('cascade') 进行了测试,但在我的情况下它不起作用。我试图删除的资源有一个带有hasMany()的模型

        /**
         * Get the departments of the organization
         *
         * @return void
         */
        public function org_departments()
        {
            return $this->hasMany(Department::class);
        }
        

        所以,在destroy() 中为控制器OrganizationUserController,而不是拥有

        $organization->delete();
        

        我确保首先删除该组织的部门,然后才删除$organization

        $organization->org_departments()->delete();
        
        $organization->delete();
        

        然后删除就好了。

        【讨论】:

          猜你喜欢
          • 2019-05-25
          • 2017-06-11
          • 1970-01-01
          • 2021-12-14
          • 2014-11-11
          • 2017-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多