我想用一些随机但固定的数据集来作为我的数据库的种子。我有几列数据可以是随机的,但对于一列(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
您应该允许您的工厂生成一个随机的城市名称,并使用播种机确保您具有所需的数据集。
将模型工厂更新为:
$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,
]);
});
}
}
您可以在伪造者实例上使用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提供的解决方案会更好并且更具语义。