Laravel 7.x - 自反关系 - 即使有适当的约束,“无法删除或更新父行”

Posted

技术标签:

【中文标题】Laravel 7.x - 自反关系 - 即使有适当的约束,“无法删除或更新父行”【英文标题】:Laravel 7.x - Reflexive Relationship - 'Cannot delete or update a parent row' even with proper constraints 【发布时间】:2021-02-02 03:14:06 【问题描述】:

你好

我有一个代表文件夹的表格,引用父文件夹的“编号”(!= ID)。这是一个名为“文件夹”的表的自反关系。

ID 为 1、2、3、4,...,并且可以不能编辑。

“folder_number”列包含“2048759”、“5789516”等值,可由管理员编辑。

示例: 文件夹可以有父文件夹。 (一) 文件夹可以有子文件夹(0 或一个或多个) 文件夹的父文件夹编号存储在“parent_folder_number”列中。

我想要:

当用户(管理员)更新文件夹上的“文件夹编号”时,我希望所有子文件夹都更新其“父文件夹编号”字段。

但是(t):

在更新父行时,我遇到了 FK 约束问题。

这是我创建表的迁移:

Schema::create('folders', function (Blueprint $table)

[...]
    $table->id();
    $table->bigInteger('folder_number')
          ->unsigned()
          ->index()
          ->onDelete('SET NULL')
          ->onUpdate('CASCADE');
    $table->bigInteger('parent_folder_number')
          ->unsigned()
          ->nullable();
[...]
);

在另一个迁移中,我为我的 FK 添加了以下约束:

Schema::table('folders', function(Blueprint $table)

[...]
    $table->foreign('parent_folder_number')
         ->onDelete('SET NULL')
         ->onUpdate('CASCADE')
         ->references('folder_number')->on('folders');
[...]
);

一切都应该工作,但是当我将父文件夹添加到文件夹然后想要更改此父文件夹的编号时,会发生这种情况:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`db`.`folders`, CONSTRAINT `folders_parent_folder_number_foreign` FOREIGN KEY (`parent_folder_number`) REFERENCES `folders` (`number`) ON DELETE SET NULL ON UPDATE CASCADE) (SQL: update `folders` set `number` = 1 where `id` = 9)

有人可以帮我弄清楚吗?谢谢 :D

【问题讨论】:

【参考方案1】:

我已尝试重新阅读文档并进行一些修复,但我仍然遇到问题。

如果有人有一个不包括做数据透视表的解决方案,我很感兴趣!

【讨论】:

以上是关于Laravel 7.x - 自反关系 - 即使有适当的约束,“无法删除或更新父行”的主要内容,如果未能解决你的问题,请参考以下文章

如何理解UML中类似于自反关联的“自反聚合”关系

在 SQLAlchemy 中“扩展”自反多对多关系

带有 Vuejs 的 Laravel 7.x Sanctum (SPA) 总是返回 401 Unauthorized

如何在 Access 中实现自反主键/外键关系?

即使 laravel 中不存在数据,关系仍然返回行

二元关系的关系的闭包