Laravel Transhable заводской посев с динамическими локалями
Я хочу собрать на заводе переводимую модель, не жестко программируя локали.
Есть два значения, которые я должен посеять: слизняк, который нельзя перевести, и заголовок, который необходимо перевести на все языки из таблицы языков.
Вот заводской файл:
$factory->define(App\Category::class, function (Faker $faker) {
$counter = 1;
$locales = Language::pluck('lang'); //returns hr,en,de
$titles = [];
foreach ($locales as $locale) {
$titles[$locale] = [
'title' => 'Title for category-' .$counter++. ' on '. $locale . ' language'
];
}
/*
$titles =
"hr" => array:1 [
"title" => "Title for category-1 on hr language"
]
"en" => array:1 [
"title" => "Title for category-2 on en language"
...
*/
return [
'slug' => 'category-'.$counter++,
$titles
];
});
Это дает мне ошибку:
Столбец не найден: 1054 Неизвестный столбец 'hr'
Запрос, созданный фабрикой:
вставить в
category_translations
(locale
,hr
,en
,de
,test
,category_id
) значения (0, заголовок для категории-1 на языке hr, заголовок для категории-2 на языке en, заголовок для категории-3 на языке, заголовок для категории-4 на тестовом языке, 20))
2 ответа
Решение
После некоторых экспериментов я нашел решение, вот оно:
$factory->define(App\Category::class, function (Faker $faker) {
static $counter = 1;
$locales = Language::pluck('lang');
$titles = array('slug' => 'CATEGORY-'.$counter);
foreach ($locales as $locale) {
$titles[$locale] = [
'title' => 'Title for category-' .$counter. ' on '. $locale . ' language'
];
}
$counter++;
return $titles;
});
Решение для Laravel 9
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Attribute>
*/
class AttributeFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
$title = faker_translation('lastName');
return [
'title' => $title,
];
}
}
app.php
'fallback_locale' => 'en',
'faker_locale' => 'lt_LT',
'locales' => [
'lt' => 'Lietuvių',
'en' => 'English',
'ru' => 'Русский',
],
'faker_locales' => [
'lt' => 'lt_LT',
'en' => 'en_US',
'ru' => 'ru_RU',
],
helpers.php
if (! function_exists('faker_translation')) {
function faker_translation($property = 'name')
{
$fakerLocales = config('app.faker_locales');
return collect(config('app.locales'))
->map(fn ($locale, $key) => faker($fakerLocales[$key])->unique()->$property)
->toArray();
}
}
composer.json
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
"files": [
"app/helpers.php"
]
},