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

问题描述 投票:0回答:2

我想用一些随机但固定的数据集来作为我的数据库的种子。我有几列数据可以是随机的,但对于一列(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表中创建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

laravel factory faker
2个回答
1
投票

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

将模型工厂更新为:

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

0
投票

您可以在伪造者实例上使用unique()方法:

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

[请记住,如果生成的城市多于数组中元素的数量,您将获得Exception,因为如果所有值都已被提取一次,伪造者将找不到唯一的值。

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

© www.soinside.com 2019 - 2024. All rights reserved.