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的主要内容,如果未能解决你的问题,请参考以下文章

laravel 中的关系和刀片

Laravel:模型中的动态关系

工会中的Laravel关系冲突

Laravel 5 中的复杂关系形成

Laravel Eloquent 中的 Audit belongsTo 关系

Laravel 中的关系 0...1