【问题标题】:Seeding with two foreign key through relationship in laravel通过laravel中的关系用两个外键播种
【发布时间】:2018-09-14 05:24:24
【问题描述】:

我有表userspostscomments,一个用户有很多帖子,每个帖子有很多 cmets(post_id 在 cmets 表中),还有一个用户有很多 cmets,但并不完全需要匿名用户(评论表中的user_id),下面的代码为每个帖子添加了一些 cmets,但 user_id 永远不会由评论的所有者填写。我希望评论通过在$factory->define 之外的数组中注入相关的user_id。实际上我可以将随机 user_id 放在工厂中,但总随机用户必须与 Seeder 类中的值相同。

**CommentFactory.php**   

$factory->define(App\Contact::class, function (Faker $faker) {
return [
        // 'user_id' => $faker->randomElement([null, rand(0, 9)]), 
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'contact' => $faker->phoneNumber,
        'website' => $faker->domainName,
        'subject' => $faker->sentence(),
        'message' => $faker->paragraph(5),
    ];
});

**UserSeeder.php**

factory(App\User::class, 10)->create()->each(function ($user) {
   $user->posts()->saveMany(factory(App\Post::class, rand(2, 10))->make());
   $user->posts->each(function ($post) use ($user) {    
      // how to inject user_id value from here (comment factory)
      $post->comments()->saveMany(factory(App\Comment::class, rand(2, 10))->make());
   });
});

【问题讨论】:

    标签: laravel eloquent laravel-seeding


    【解决方案1】:

    您可以将一组属性/值传递给 make 方法:

    factory(App\Comment::class, rand(2, 10))->make(['user_id'=>$user->id]);
    

    编辑:只需遍历 cmets 并分配一个随机用户 ID:

    factory(App\Comment::class, rand(2, 10))->create()->each(function($comment){
       $comment->update(['user_id'=>\App\User::all()->random()->id]);
    }); 
    

    如果您想要随机匿名评论者:

    factory(App\Comment::class, rand(2, 10))->create()->each(function($comment){
       // pick either a random user_id or null;
       $userId=array_random(\App\User::all()->random()->id, null);
       $comment->update(['user_id'=>$userId]);
    });
    

    【讨论】:

    • $user->id实际上是post author,评论作者可以是任何人,我在当前post中使用saveMany创建了许多cmets,所以结果是所有cmets都有相同的user_id。我考虑使用手动循环插入许多 cmets。
    猜你喜欢
    • 2019-07-13
    • 2020-10-04
    • 2016-05-28
    • 2015-12-20
    • 1970-01-01
    • 2018-03-29
    • 2017-09-15
    • 2018-04-22
    • 2018-08-28
    相关资源
    最近更新 更多