【问题标题】:Laravel set incremental id value when seeding tableLaravel 在播种表时设置增量 id 值
【发布时间】:2018-01-20 23:37:49
【问题描述】:

我正在尝试使用 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?提前致谢。

【问题讨论】:

  • 不清楚您需要什么,主键应该是“正数”,例如 1.. 如果您有 10 条记录,您将获得 1 - 10 的 id。您可以在播种前截断表以确保键从 1 点到 10 点。
  • 我想给播种机定义ID值。在示例中,我将 ID 设置为 = 0,但是当它添加到表中时,它会增加而不是设置为零
  • 我认为您在使用播种机时无法设置主键。为什么要设置它?如果您需要 FK 关系,请先播种主表并在另一个播种器中查询 id。

标签: php laravel laravel-5.4


【解决方案1】:

在自动递增字段中存储NULL0 是分配下一个递增值的触发器之一。

来自 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 会生成下一个序列号。

如果 0 已存储在表的 AUTO_INCREMENT 列中,则此模式很有用。 (顺便说一下,不推荐存储 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'
    ]);
}

【讨论】:

    【解决方案2】:

    它发生的原因是Guarding Attributes$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'
        ]);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 2018-12-11
      • 1970-01-01
      • 2019-05-18
      • 2012-02-08
      • 2018-04-11
      • 2015-02-10
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多