Laravel 6+ 中具有固定数据集的种子数据库

Seed DB in Laravel 6+ with fixed datasets

我想在我的数据库中植入一些随机但固定的数据集。 我有几列的数据可以是随机的,但对于一列(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
    ];
});

应该在 City table 中创建 4 个新行(没有重复),其中每个名称都来自上面的数组,但是当我 运行 我的代码修改时:

$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

您应该允许您的工厂生成一个随机的城市名称,并使用您的播种机来确保您拥有所需的数据集。

将您的模型工厂更新为:

$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,
            ]);
        });
    }
}

您可以在 faker 实例上使用 unique() 方法:

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

请记住,如果您生成的城市数量多于数组中元素的数量,您将得到一个异常,因为如果所有值都已被提取一次,faker 将无法找到唯一的值。

无论如何,如果您需要从固定集合中创建项目,@ChinLeung 提供的解决方案会更好、更符合语义。

对于这个特定的错误,尝试

$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();
    }