如何用Faker PHP库模型工厂为每个用户生成多条评论(如3条)?
为每个用户生成多条评论的解决方案
嘿,这个问题很好解决!你当前的代码只生成1条评论是因为每次只创建了一个评论实例并关联保存。要给每个用户生成3条评论,这里有两种实用的写法:
方法一:使用循环(灵活定制每条评论)
如果需要给每条评论设置不同的属性(比如不同的状态、内容风格),用循环的方式会更灵活:
factory(App\User::class, 50)->create()->each(function ($u) { // 循环3次,为当前用户生成3条评论 for ($i = 0; $i < 3; $i++) { $u->comments()->save(factory(App\Comment::class)->make()); } });
你还可以在循环内部对每条评论的属性单独调整,比如给特定位置的评论设置特殊状态:
for ($i = 0; $i < 3; $i++) { $comment = factory(App\Comment::class)->make(); // 给第2条评论标记为已审核 if ($i === 1) { $comment->status = 'approved'; } $u->comments()->save($comment); }
方法二:使用saveMany批量生成(简洁高效)
如果不需要单独定制每条评论,用saveMany的写法会更简洁,一次性生成多个评论实例并关联保存:
factory(App\User::class, 50)->create()->each(function ($u) { // 直接生成3个评论实例,批量关联保存 $u->comments()->saveMany(factory(App\Comment::class, 3)->make()); });
这里factory(App\Comment::class, 3)->make()会生成3个未持久化的Comment对象,saveMany方法会自动把它们都关联到当前用户并保存到数据库。
补充:Laravel 8+ 新版本工厂写法
如果你的项目用的是Laravel 8及以上版本,工厂已经改为类的形式,写法会变成这样:
App\Models\User::factory()->count(50)->create()->each(function ($u) { $u->comments()->saveMany(App\Models\Comment::factory()->count(3)->make()); });
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

