使用Laravel工厂时,如何确保Job的company_id与关联Contact的company_id匹配?
解决方案
你可以通过先创建关联的Company实例,再基于该实例创建Contact,最后将两者的ID分别赋值给Job的对应字段,确保company_id匹配。
方法一:直接在工厂中关联创建
修改JobFactory的定义如下:
class JobFactory extends Factory { public function definition(): array { // 先创建一个公司实例 $company = Company::factory()->create(); // 基于该公司创建联系人,自动关联company_id $contact = Contact::factory()->for($company)->create(); return [ "title" => fake()->sentence(), "company_id" => $company->id, "contact_id" => $contact->id, ]; } }
这种方式会一次性创建关联的公司、联系人及职位,三者的company_id完全一致。
方法二:利用闭包延迟关联
如果你希望避免提前持久化实例(比如使用make()方法时),可以通过闭包基于已生成的company_id创建联系人:
class JobFactory extends Factory { public function definition(): array { return [ "title" => fake()->sentence(), "company_id" => Company::factory(), "contact_id" => function (array $attributes) { // 利用已生成的company_id创建对应的联系人 return Contact::factory() ->for(Company::find($attributes['company_id'])) ->create()->id; }, ]; } }
注意事项
如果你的ContactFactory默认会自动创建新的Company(比如定义中有'company_id' => Company::factory()),使用for($company)方法会覆盖这个默认行为,强制使用指定的公司实例,避免生成额外的无关公司。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

