Laravel 为同一工厂调用之间不隔离的每个工厂创建

Laravel Factory Create for Each Not Isolated Between the Same Factory Invocations

我本以为工厂创建是孤立的,所以我可以这样做:

factory(Ctow\User::class, 5)->each(function($user) { 
  // Add relations to 5 users created
});
factory(Ctow\User::class, 5)->each(function() { 
  // Add different relations to 5 different users created
  // and not include the previously created users
  // in the iteration
});

但在种子中执行此操作:

factory(Ctow\User::class)->create(['username' => 'test1@example.com']);
factory(Ctow\User::class)->create(['username' => 'test2@example.com']);
factory(Ctow\User::class)->create(['username' => 'test3@example.com']);

factory(Ctow\User::class)
    ->create(['username' => 'final@example.com'])
    ->each(function ($user) {
        \Illuminate\Support\Facades\Log::info('USER', [$user->username]);
    });

播种的输出结果如下所示,但我原以为它只会包含一条记录 final@example.com,而不包含之前创建的用户:

// Actual Result
[2019-02-17 22:52:05] local.INFO: USER ["test1@example.com"] 
[2019-02-17 22:52:05] local.INFO: USER ["test2@example.com"] 
[2019-02-17 22:52:06] local.INFO: USER ["test3@example.com"] 
[2019-02-17 22:52:06] local.INFO: USER ["final@example.com"] 
// Expected Result
[2019-02-17 22:52:06] local.INFO: USER ["final@example.com"] 

如果您在不同的种子文件中执行此操作,它会产生相同的结果,因此它会根据所使用的工厂以及本地文件发生。此外,在使用关联的工厂状态创建时发生。

有没有办法在不发生这种情况的情况下隔离相同工厂调用之间的添加关系?所以我可以创建没有相关模型的用户,然后只添加关系到几个特定的​​模型吗?

answer 不会在单个模型创建中使用 each,因为它委托给构建器,因为模型没有 each 方法。