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"
    ]
},
Другие вопросы по тегам