【问题标题】:Laravel Seeding not workingLaravel 播种不起作用
【发布时间】:2018-06-17 03:16:09
【问题描述】:

考虑下面的代码:

foreach ($departments as $department)
        {
            factory(App\User::class, 100)->create()
            ->each(function ($u) use($department)
            {

                $u->employee()->save(factory(App\Employee::class)->make([
                    'department' => $department,
                    'emp_id' => '',
                ]));

            });

        }

现在对于emp_id,我希望外部 foreach 循环的每个迭代都有从 1 到 100 的增量值。。 p>

例子:

第一次迭代 100 个用户和 100 个员工记录应创建 emp_id 1 到 100,部门为 'abc'

第二次迭代再次创建 100 个用户和 100 个员工记录,emp_id 为 1 到 100,部门为“xyz” 等等。

我试图在工厂之前声明 $i=1 然后增加 $i withing each() 但它不起作用并给出了duplicate key error

请注意,我的表中员工的唯一约束是 部门-emp_id

【问题讨论】:

  • 您对这些数据库表之一(可能是employees 表)有任何(唯一)约束吗?
  • 我已经在最后提到过,我对组合列 department-emp_id 有一个唯一约束
  • 对不起,由于颜色,我完全忽略了它。 $department 是整数还是模型?
  • $department 只是“abc”、“xyz”等部门的不同名称
  • 我认为您的解决方案应该可行,而且它一定是一个引起麻烦的小细节。您是否已将计数变量添加到 each() 中函数的 use 部分?您是否尝试在 each() 中转储计数变量的内容?

标签: php laravel-5 laravel-seeding


【解决方案1】:

这是一个棘手的问题。您的索引变量的值不会更新,因为当您将原语传递给 use 子句中的函数时,它们会被复制。默认情况下,只有对象通过引用传递。

要解决这个问题,您需要通过在前面添加 & 来明确地将索引变量作为引用传递:

foreach ($departments as $department)
{
    $i = 1;
    factory(App\User::class, 100)->create()
        ->each(function ($u) use ($department, &$i)
        {
            $u->employee()->save(factory(App\Employee::class)->make([
                'department' => $department,
                'emp_id' => $i++,
            ]));
        });
}

我拼凑了一个小例子来展示3v4l的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2021-02-11
    • 2017-09-18
    相关资源
    最近更新 更多