I have a hasOne
relationship in that a Campaign
hasOne
Product
The Product
belongsTo
the Campaign
.
In this particular case, in the products
database table, there should only ever be one, unique reference to a campaign
. I set the constraint on the database side to unique
. My question is, when defining a factory, how do I ensure that it picks a unique Campaign, which was previously created by a seeder?
class ProductFactory extends Factory
{
protected $model = Product::class;
public function definition()
{
return [
//
'name' => $this->faker->sentence,
'description' => $this->faker->paragraph,
'campaign_id' => Campaign::inRandomOrder()->first()->id, # this won't work
];
}
It is obvious why Campaign::inRandomOrder()->first()->id
won’t work. I don’t necessarily want to use a Campaign factory here to create a new Campaign either because there’s a lot of nuances in how each instance is created and I already take care of that in my CampaignSeeder
I am interested in just associating each Product created with a Campaign
that has yet to be claimed when I seed. What’s the best way to approach this?
Advertisement
Answer
Assuming you have a relationship product in your campaign model
class ProductFactory extends Factory
{
protected $model = Product::class;
public function definition()
{
return [
//
'name' => $this->faker->sentence,
'description' => $this->faker->paragraph,
'campaign_id' => Campaign::doesntHave('product')->first()->id,
];
}
everytime it will get first campaign in your table that doesnt have a product