Mam związek hasOne w tym Campaign hasOne Product

Product belongsTo Campaign.

W tym konkretnym przypadku, w tabeli bazy danych products, powinno być tylko jedno, unikalne odniesienie do campaign. Ustawiam ograniczenie strony bazy danych do unique. Moje pytanie brzmi: podczas definiowania fabryki, jak upewnić się, że wybiera wyjątkową kampanię, która była wcześniej utworzona przez siewnika?

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
        ];
    }

Jest oczywiste, dlaczego Campaign::inRandomOrder()->first()->id nie działa. Niekoniecznie chcę korzystać z fabryki kampanii tutaj, aby stworzyć nową kampanię, ponieważ jest wiele niuansów, w jaki sposób każda instancja jest tworzona i już dbam o to w moim CampaignSeeder

Jestem zainteresowany tylko kojarzeniem każdego produktu utworzonego za pomocą Campaign, który jeszcze nie otrzymał, gdy nasi się. Jaki jest najlepszy sposób na podejście?

1
randombits 21 listopad 2020, 02:10

1 odpowiedź

Najlepsza odpowiedź

Zakładając, że masz produkt w modelu kampanii

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, 
        ];
    }

Za każdym razem, gdy otrzyma pierwszą kampanię w tabeli, która nie ma produktu

2
Marwane Ezzaze 21 listopad 2020, 00:35