如何在Laravel工厂make()方法中获取BelongsToMany关联数据
解决Laravel工厂make()方法无法访问BelongsToMany关联的问题
Laravel里用make()生成非持久化模型时,has()方法对BelongsToMany关联不起作用——因为多对多依赖中间表,而make()不会在内存中处理这种关联绑定。但BelongsTo能正常访问是因为你手动设置了user_id,模型可以通过这个ID关联到已有的$user实例。
要在不持久化的情况下让$record->comments返回生成的评论,你需要手动在内存中绑定关联关系,具体可以用afterMaking回调配合setRelation()方法:
方法一:调用工厂时直接添加回调
$record = Post::factory() ->afterMaking(function (Post $post) { // 生成2个内存中的Comment实例 $comments = Comment::factory()->count(2)->make(); // 将评论绑定到Post的comments关联上 $post->setRelation('comments', $comments); }) ->make([ 'title' => fake()->word, 'user_id' => $user->id, ]);
方法二:在Post工厂中定义可复用的方法
在PostFactory.php里添加一个自定义方法,方便重复调用:
class PostFactory extends Factory { protected $model = Post::class; public function definition() { return [ 'title' => $this->faker->word, // 这里可以默认关联User工厂,也可以留空后续手动传入 'user_id' => User::factory(), ]; } // 定义带评论的扩展方法 public function withComments(int $count = 2) { return $this->afterMaking(function (Post $post) use ($count) { $comments = Comment::factory()->count($count)->make(); $post->setRelation('comments', $comments); }); } }
之后调用工厂时直接用这个方法:
$record = Post::factory() ->withComments(2) ->make([ 'title' => fake()->word, 'user_id' => $user->id, ]);
这样处理后,你就能直接访问$record->comments获取到生成的2条评论实例,全程不需要将任何数据持久化到数据库。
内容的提问来源于stack exchange,提问作者Naung Ye Htet
相关产品推荐
相关产品推荐

