传入外键ID时如何避免工厂自动创建关联模型
解决Laravel工厂传入指定user_id时自动创建新用户的问题
这个问题我之前也碰到过,其实只需要在工厂定义里加个简单的条件判断就能解决啦!核心思路就是只在没有传入user_id参数的时候,才自动创建新的User模型。
修改后的PostFactory代码
$factory->define(Post::class, function (Faker $faker) { return [ 'title' => $faker->word, 'user_id' => function ($attributes) { // 如果传入了user_id,就直接使用它;否则创建新用户 return $attributes['user_id'] ?? factory(User::class)->create()->id; } ]; });
原理说明
原来的写法中,不管你调用create()时有没有传入user_id,工厂都会无条件执行factory(User::class)->create()->id,所以每创建一篇文章就会生成一个新用户。现在我们把user_id的值改成一个闭包,这个闭包会接收调用时传入的所有$attributes参数:
- 如果传入了
user_id,就直接使用这个值; - 如果没传入,才会创建新的User模型并取它的id。
验证调用效果
当你像之前那样调用时:
$user = factory(User::class)->create(); factory(Post::class, 5)->create(['user_id'=>$user->id]);
现在数据库里只会生成1个用户和5篇关联到该用户的文章,完全符合你的预期~
Laravel 8+类式工厂写法(可选)
如果你使用的是Laravel 8及以上版本的类式工厂,写法逻辑一致:
public function definition() { return [ 'title' => $this->faker->word, 'user_id' => function (array $attributes) { return $attributes['user_id'] ?? User::factory()->create()->id; } ]; }
内容的提问来源于stack exchange,提问作者Andriy Lozynskiy
相关产品推荐
相关产品推荐

