Laravel 迁移 onDelete() 查询异常

Posted

技术标签:

【中文标题】Laravel 迁移 onDelete() 查询异常【英文标题】:Laravel Migration onDelete() Query Exception 【发布时间】:2019-10-05 15:59:36 【问题描述】:

我有一个带有外键的简单 laravel 迁移。

public function up()

    Schema::create('smp_posts', function (Blueprint $table) 
        $table->increments('id');
        $table->integer('project_id')->unsigned();
        // Some other stuff
        $table->foreign('project_id')->references('id')->on('smp_projects')->onDelete('cascade');
    );

当我运行迁移命令php artisan migrate:refresh。我收到此错误:

照亮\数据库\查询异常:

SQLSTATE[2BP01]:依赖对象仍然存在:7

错误:无法删除表 smp_projects,因为其他对象依赖于它 详细信息:表 smp_posts 上的约束 smp_posts_project_id_foreign 取决于表 smp_projects

通常应该删除所有孩子,因为我将onDelete() 设置为级联。正确的?怎么了?

【问题讨论】:

可能 smp_projects 迁移的日期在 sms_posts 之后,请检查迁移的名称。 在 smp_projects 之后没有 smp_posts 【参考方案1】:

您设置的cascade 选项仅在您删除一行时适用。如果您删除未触发约束的表,这就是您收到错误的原因。

您应该查看 Postgres 文档的 Dependency Tracking 部分

【讨论】:

以上是关于Laravel 迁移 onDelete() 查询异常的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 外键 onDelete('cascade') 不起作用

Laravel Migrations onDelete Restrict 不起作用

Laravel 权限管理总结

Eloquent - 如果外键有行,则防止删除数据 - Laravel

使用 PostgreSQL 更新 Laravel 迁移中的枚举列

我们可以在 Laravel 迁移中的单个 DB::statement("Query 1; Query 2") 中使用多个 SQL 查询吗?