php 工厂创建具有不同数量关系的多个模型

jfgube3f  于 2023-09-29  发布在  PHP
关注(0)|答案(3)|浏览(104)

我使用下面的代码创建了20篇文章,每篇文章有3条评论。

Post::factory()
    ->times(20)
    ->has(Comment::factory()->times(3))
    ->create()

相反,我想创建20个帖子,每个帖子都有随机数量的评论(例如:帖子1有2条评论,帖子2有4条评论,等等)
这不起作用,每个帖子都有相同的(随机)评论数。

Post::factory()
    ->times(20)
    ->has(Comment::factory()->times(rand(1, 5)))
    ->create()

我如何才能做到这一点?

ejk8hzay

ejk8hzay1#

据我所知,如果你使用的是->times,那么每个模型不可能有一个动态的相关模型数。您可以尝试:

collect(range(0,19))
   ->each(function () {
       Post::factory()
          ->has(Comment::factory()->times(rand(1,5)))
          ->create();
});

这应该会创建20个帖子,每个帖子上都有随机数量的评论。它可能会慢一点,但可能不会太多

t3irkdon

t3irkdon2#

我会用工厂的方法来做这件事。向Post工厂添加一个方法,如下所示:

<?php
namespace Database\Factories\App;

use App\Comment;
use App\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    public function definition(): array
    {
        return [
            // ...
        ];
    }

    public function addComments(int $count = null): self
    {
        $count = $count ?? rand(1, 5);
    
        return $this->afterCreating(
            fn (Post $post) => Comment::factory()->count($count)->for($post)->create()
        );
    }
}

然后在测试中,你可以简单地这样调用它:

Post::factory()->count(20)->addComments()->create();
rbl8hiat

rbl8hiat3#

**更新:**应该工作:灵感来自于apokryfos。如果这不起作用,那将:

for($i=0; $i<20; $i++)
{
    $times = rand(1,5);
    Post::factory()
     ->has(Comment::factory()->times($times))
     ->create();
}

相关问题