Завод Laravel и выбрал уникальный экземпляр belongsTo

#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