Как передать параметр в factory на laravel 9
Есть необходимость засеять БД данными на разных языках. Например, модель Books с полями title, content и указанием на язык из другой таблицы - language_id
Schema::create('languages', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('code', 2);
$table->timestamps();
});
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->foreignId('language_id');
$table->string('title');
$table->text('content');
$table->timestamps();
$table->foreign('language_id')->references('id')->on('languages')->onUpdate('cascade')->onDelete('cascade');
});
Создаю BookFactory
class BookFactory extends Factory
{
public function definition()
{
return [
'title' => fake()->sentence(rand(3, 7)),
'content' => fake()->sentences(rand(5, 11))
];
}
}
функция fake() может принимать параметр, указывающий на язык, на котором следует генерировать данные, например, de_DE или ru_RU.
Как мне передать в facotry переменную с указанием локали из сидера?
class DatabaseSeeder extends Seeder
{
public function run()
{
\App\Models\Book::factory(10)->create();
}
}
Ответы (1 шт):
Автор решения: Dmitrii Sedov
→ Ссылка
Всё делается довольно просто. Определите в Вашей фабрике дополнительный метод, который будет принимать параметр языка. Он должен возвращать результат вызова $this->state(...). Пример.
public function withLang(string $lang)
{
return $this->state(function (array $attributes) use ($lang) {
return [
'name' => fake($lang)->name,
'lastName' => fake($lang)->lastName,
];
});
}
\App\Models\User::factory()->count(5)->withLang('de_DE')->create();
\App\Models\User::factory()->count(7)->withLang('ru_RU')->create();