#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,
}
];
}
затем вы можете заменить значение