#php #laravel #eloquent #factory
#php #laravel #красноречивый #фабрика
Вопрос:
У меня есть hasOne
связь в том, что Campaign
hasOne
Product
The Product
belongsTo
the Campaign
.
В этом конкретном случае в таблице products
базы данных должна быть только одна уникальная ссылка на a campaign
. Я установил ограничение на стороне базы данных на unique
. Мой вопрос в том, что при определении фабрики, как мне убедиться, что она выбирает уникальную кампанию, которая ранее была создана сеялкой?
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
];
}
Очевидно, почему Campaign::inRandomOrder()->first()->id
это не сработает. Я не обязательно хочу использовать фабрику кампаний здесь для создания новой кампании, потому что есть много нюансов в том, как создается каждый экземпляр, и я уже позабочусь об этом в своем CampaignSeeder
Я заинтересован в том, чтобы просто связать каждый созданный продукт с a Campaign
, который еще не был востребован при заполнении. Каков наилучший способ подойти к этому?
Ответ №1:
Предполагая, что у вас есть продукт отношений в вашей модели кампании
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,
];
}
каждый раз он будет получать первую кампанию в вашей таблице, в которой нет продукта
Комментарии:
1. пожалуйста, вы можете найти другие, которые могут вам понадобиться в будущем, в документах laravel: laravel.com/docs/8.x/eloquent-relationships