我正在尝试使用 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?预先感谢。
发生这种情况的原因是守护属性。
$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'
]);
}
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'
]);
}