Класс фабрики Laravel 8 не переопределяет параметры при создании фабрик

#laravel-8 #laravel-factory

#laravel-8 #laravel-factory

Вопрос:

Я разрабатываю веб-приложение с использованием Laravel 8. Я заметил, что в Laravel 8 изменилось довольно много вещей, включая фабрики.

У меня есть заводской класс MenuCategoryFactory для моего класса модели MenuCategory со следующим определением.

 <?php

namespace DatabaseFactories;

use AppModelsMenu;
use AppModelsMenuCategory;
use IlluminateDatabaseEloquentFactoriesFactory;

class MenuCategoryFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = MenuCategory::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => Menu::factory()->create(),
        ];
    }
}
  

В моем коде (классе обработки базы данных) я пытаюсь переопределить menu_id следующим образом при создании фабрик.

 $restaurant = Restaurant::first();
        MenuCategory::factory()->create([
            'menu_id' => $restaurant->menu->id
        ]);
  

Но он не использует значение, которое я передал, $restaurant-> menu-> id . Вместо этого он создает новое меню. Чего не хватает в моем коде и как я могу это исправить?

Комментарии:

1. Я получаю ту же проблему. Я обнаружил, что он, который вы используете make , переопределяет значения…

2. make Метод не сохраняется в базе данных, а просто создает объект / модель. Это будет сделано для тестирования. Вам придется сохранять объект самостоятельно.

3. имея ту же проблему, вы когда-нибудь решали это?

Ответ №1:

В вашем определении фабрики не вызывайте ->create() , вместо этого настройте его следующим образом:

 public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => Menu::factory(),
        ];
    }
  

Тогда вы сможете настроить связанные модели (при условии, что вы настроили отношения в модели) следующим образом:

 $restaurant = Restaurant::first();
MenuCategory::factory()->for($restaurant)->create();
  

Ответ №2:

Измените определение на

 public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => function() {
                 Menu::factory()->create()->id,
            }
        ];
    }
  

затем вы можете заменить значение