База данных семян в Laravel 6+ с фиксированными наборами данных - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу заполнить мою БД некоторыми случайными, но также фиксированными наборами данных. У меня есть несколько столбцов, данные которых могут быть случайными, но для одного столбца (name) мне нужен жестко закодированный массив значений, который не может быть случайным, но должен быть сгенерирован по порядку.

$factory->define(City::class, function (Faker $faker) {
    return [
        'name' => $faker->randomElements(['Tokyo', 'Paris', 'London', 'Milan'], $count = 1, $allowDuplicates = false),
        'code' => $faker->isbn,
        'description' => $faker->paragraph
    ];
});

, который должен создать 4 новые строки (без дубликатов) в таблице City, где каждое имя относится к указанному выше массиву, но когда я запускаю свой код в тинкере с:

$cities = factory(App\City::class)->make();
$cities->save();

Я получаю ошибку TypeError: Argument 1 passed to Illuminate/Database/Grammar::parameterize() must be of the type array, string given

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

Вы можете использовать метод unique() в экземпляре фейера:

$factory->define(City::class, function (Faker $faker) {
    return [
        'name' => $faker->unique()->randomElement(['Tokyo', 'Paris', 'London', 'Milan']),
        'code' => $faker->isbn,
        'description' => $faker->paragraph
    ];
});

Имейте в виду, что если вы сгенерируете больше городов, чем количество элементов в массиве, вы получите исключение, поскольку фейкер может не найти уникальное значение, если все значения уже были извлечены один раз.

В любом случае, если вам нужно создавать элементы из фиксированной коллекции, решение, предоставляемое @ChinLeung, будет лучше и более семантическим.

1 голос
/ 07 февраля 2020

Для этой конкретной ошибки попробуйте

$factory->define(City::class, function (Faker $faker) {
    return [
        'name' => $faker->unique()->randomElement($array = array ('Tokyo','London', 'Paris', 'Milan')),
        'code' => $faker->isbn,
        'description' => $faker->paragraph
    ];
});

Затем измените сеялку на

public function run()
    {
        //
        factory(App\City::class, 4)->create();
    }
1 голос
/ 07 февраля 2020

Вы должны разрешить вашей фабрике генерировать случайное название города и использовать сеялку, чтобы убедиться, что у вас есть требуемый набор данных.

Обновите фабрику вашей модели до этого:

$factory->define(City::class, function (Faker $faker) {
    return [
        'name' => $faker->city,
        'code' => $faker->isbn,
        'description' => $faker->paragraph
    ];
});

Тогда в вашей сеялке:

class CitiesTableSeeder extends Seeder
{
    public function run()
    {
        collect(['Tokyo', 'Paris', 'London', 'Milan'])->each(function ($name) {
            factory(App\City::class)->create([
                'name' => $name,
            ]);
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...