在Laravel工厂使用模型计数

时间:2017-05-26 23:11:44

标签: laravel laravel-seeding

我在UserPost之间存在一对多的关系。我正在使用数据库播种机和工厂来生成虚假数据。我想生成类似的数据到下表。

用户

user_id | name
------- | ------
   1    | Tim

发表

post_id |  FK:user_id  | order 
--------|--------------|-------
   1    |       1      |   0  
   2    |       1      |   1   
   3    |       1      |   2   
   4    |       1      |   3   

为此,我创建了一个工厂,用于选择随机用户并计算与该用户关联的帖子数

$factory->define(App\Post::class, function (Faker\Generator $faker) {

  $user = App\User::inRandomOrder()->firstOrFail();
  $order = Post::where(['user_id' => $user->user_id])->count();

  return [
    'user_id' => $user->user_id,
    'order' => $order,
  ];
});

种子2后产生。

post_id |  FK:user_id  | order 
--------|--------------|-------
   1    |       1      |   0   
   2    |       1      |   0     

再播种2次

   3    |       1      |   2   
   4    |       1      |   2   

在我看来,Laravel在运行查询之前会生成所有插入语句。因此Post::where(['user_id' => $user->user_id)->count();不会按预期增加。

如何递增Post.order以使其始终是特定用户序列中的下一个数字?

1 个答案:

答案 0 :(得分:1)

您始终可以循环播种数据。

for ($i = 0; $i < 10; $i++) {
    factory(App\Post::class)->create();
}