Laravel 8 - 工厂 & 外键

7

我找不到如何在创建工厂和填充器时管理外键的方法。

我有一个 users 表和一个 blog_posts 表。 blog_posts 表有一个外键 user_id,它引用了 users.id。 我想用种子数据填充我的数据库,包括用户和博客文章。

我已经看到如何为每个填充的博客文章创建一个新用户,代码如下:

/**
 * Define the BlogPost model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'user_id' => User::factory(),
        'created_at' => now(),
        'updated_at' => now(),
        'title' => $this->faker->words(5, true),
        'body' => $this->faker->paragraphs(6, true)
    ];
}

...但是我想引用现有的用户,因为我正在执行数据库种子操作,就像这样:

/**
 * Seed the application's database.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UsersTableSeeder::class, 
        BlogPostsTableSeeder::class
    ]);
}
2个回答

12

我们可以按照以下方式从现有的 User 中检索一个随机用户,并将其分配给 BlogPost Factory

/**
 * Define the BlogPost model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'user_id' => User::inRandomOrder()->first()->id,
        'created_at' => now(),
        'updated_at' => now(),
        'title' => $this->faker->words(5, true),
        'body' => $this->faker->paragraphs(6, true)
    ];
}


5

假设您的User模型有一个名为blogPostshasMany关联,您可以执行以下操作:

User::factory()
    ->hasBlogPosts(6)
    ->create();

这将创建您的用户和6个相关的博客文章。

这绝对是一个选项,但如果博客文章工厂创建博客文章并查看用户工厂中存在哪些用户,那将更理想。 - Newb 4 You BB
1
如果您需要的是这种情况,那么Stefano的答案可能是您想要的。 - Peppermintology

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接