PHP Laravel 播种 - 外 id

PHP Laravel seeding - foreign id

提问人:Payette1996 提问时间:8/19/2023 最后编辑:Karl HillPayette1996 更新时间:8/19/2023 访问量:35

问:

下面的代码是我的数据库播种器中使用的工厂。问题在于,一些评论在帖子下,而另一些则在另一条评论下。也就是说,我需要找到一种方法来为帖子或评论生成foreign_id关系,而不是两者兼而有之。

此外,最大的挑战是,在某些情况下,评论需要与另一个评论有foreign_id关系。现在,使用下面的代码,NULL 将始终位于数据库列中comment_id...我猜它不承认该种子运行中新创建的记录......

class CommentFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'user_id' => User::inRandomOrder()->first(), // Gets a random user ID
            'post_id' => Post::inRandomOrder()->first(),
            'comment_id' => Comment::inRandomOrder()->first(), // !!! THIS LINE HERE !!!
            'content' => fake()->paragraph(2)
        ];
    }
}

我尝试在 if 语句中使用 rand(0, 1),该语句将在帖子或其他评论下创建评论。

问题是,当需要在另一个注释下创建注释时,comment_id的外部 ID 始终为 null,因为我的数据库在运行播种机时没有注释。

PHP Laravel 雄辩的 种子 工厂

评论


答:

0赞 Payette1996 8/19/2023 #1

答案如下: 我必须利用 configure() 方法和 afterCreating() 方法

class CommentFactory extends Factory
{
    public function definition()
    {
        return [
            'user_id' => User::inRandomOrder()->first()->id,
            'content' => $this->faker->paragraph(2),
        ];
    }

    public function configure()
    {
        return $this->afterCreating(fn (Comment $comment) => 
            rand(0, 1)
                ? $comment->update(['post_id' => Post::inRandomOrder()->first()->id])
                : $comment->update(['comment_id' => Comment::inRandomOrder()->first()->id])
        );
    }
}