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