Laravel 在播种表时设置增量 id 值

问题描述 投票:0回答:2

我正在尝试使用 Laravel 播种器类为 MySql 表播种。问题是它没有按照我的设置分配

id
字段(增量)值。在播种者课程中我得到:

public function run()
{

    Patropi\Entidade::create([
        'id' => '0',
        'nome' => 'entidade 0',
        'cpfcnpj' => '12345678901'
    ]);

    Patropi\Fornecedor::create([
        'id' => '0',
        'prioridade' => '0'
    ]);
}

在数据库中,

Fornecedor
表id是引用
Entidade
id的外键,这就是为什么我想在两者上拥有相同的Id。问题是,当它插入
Entidade
时,它不会将其设置为 id = 0,而是给出最后一个增量的值 + 1。如何强制 laravel 在那里插入 0?预先感谢。

php laravel laravel-5.4
2个回答
5
投票

发生这种情况的原因是守护属性

$guarded
数组中列出的属性不受更改,这意味着 Laravel 将忽略您修改它们的所有尝试。有时,这种方法也称为“批量分配保护”。 默认情况下,Laravel 会保护“id”,因此您不能也不需要手动设置它们,但是有一种方法可以使用

unguard()

方法来停止这种默认行为。

以下是修复代码的方法:

public function run() { Patropi\Entidade::unguard(); Patropi\Entidade::create([ 'id' => '0', 'nome' => 'entidade 0', 'cpfcnpj' => '12345678901' ]); Patropi\Fornecedor::create([ 'id' => '0', 'prioridade' => '0' ]); }



2
投票
NULL

0
是分配下一个增量值的触发器之一。
来自 MySQL 文档:

您还可以显式地将 0 分配给该列以生成序列号。

如果要禁用此功能,可以开启 NO_AUTO_VALUE_ON_ZERO sql 模式。这将更改 MySQL,以便仅分配
NULL

才会分配下一个增量值,并允许您将

0
存储在字段中。来自文档:

NO_AUTO_VALUE_ON_ZERO 影响 AUTO_INCREMENT 列的处理。通常,您可以通过在其中插入 NULL 或 0 来生成该列的下一个序列号。 NO_AUTO_VALUE_ON_ZERO 抑制此行为为 0,以便只有 NULL 生成下一个序列号。

如果表的 AUTO_INCREMENT 列中存储了 0,则此模式会很有用。 (顺便说一下,不建议存储 0。)

如果你没有明确需要id为0,那么我不会尝试分配0。如果id不重要,那么你可以这样做:

public function run() { $entidade = Patropi\Entidade::create([ 'nome' => 'entidade 0', 'cpfcnpj' => '12345678901' ]); Patropi\Fornecedor::create([ 'id' => $entidade->id, 'prioridade' => '0' ]); }

或者,如果您有 Eloquent 关系设置:

public function run() { $entidade = Patropi\Entidade::create([ 'nome' => 'entidade 0', 'cpfcnpj' => '12345678901' ]); // assumes fornecedor() defines a hasone/hasmany relationship. $entidade->fornecedor()->create([ 'prioridade' => '0' ]); }

© www.soinside.com 2019 - 2024. All rights reserved.