Laravel 中的关系 0...1
Posted
技术标签:
【中文标题】Laravel 中的关系 0...1【英文标题】:Relationship 0...1 in Laravel 【发布时间】:2019-05-10 18:41:47 【问题描述】:我有 2 个模型:产品和类别,其中每个产品属于一个类别(或没有)
然后我在产品表中放了一个“category_id”。但是 category_id 可以为空。
在 Laravel 中:
Schema::create('products', function (Blueprint $table)
$table->unsignedInteger('category_id')->default(0);
$table->foreign('category_id')->references('id')->on('categories');
但是当我需要将类别更改为 NULL (0) 时,我得到错误:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
我该如何解决?
最好的问候
【问题讨论】:
我认为这是一个副本:***.com/questions/37735055/… 【参考方案1】:删除default
约束。
您不能有默认值 0
,因为它在您的类别表中没有作为 ID 出现。因此,没有父母,孩子就不能在场。
重写
$table->unsignedInteger('category_id')->default(0);
到
$table->unsignedInteger('category_id')->nullable();
注意:确保始终先迁移父表,然后再迁移子表。在您的情况下,当您运行php artisan migrate
时,在product
之前迁移categories
【讨论】:
谢谢,但问题没有解决。仍然错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败。我也有类似 fillable: protected $fillable = [ 'category_id' ];我可以分配给另一个整数值(另一个 category_id),但我不能分配值 0。为什么?? 在种子中,我可以指定默认值 0。我可以更改该值并将产品指定给一个类别。但是如果我需要切换此产品并将 category_id 再次更改为 0,我会遇到此错误... 一个可能的解决方案可以是赋值 1 而不是像禁用值那样的 0,并创建一个类别(使用 category_id == 1),比如一种空类别。但可能有另一个更好的解决方案...... @JJMontalban 你从来没有说过你用这个来播种。如果您正在运行种子,那么您需要在产品种子之前运行类别种子,反之亦然。另外,您是否在类别迁移之前先创建了产品迁移? 订购迁移:1. 类别 2. 产品。并订购种子:1. 类别 2. 产品。当我运行“php artisan migrate:refresh --seed”并且在 category_id 中分配非空值时,我没有任何问题。我必须更改迁移或种子的顺序吗?以上是关于Laravel 中的关系 0...1的主要内容,如果未能解决你的问题,请参考以下文章