【问题标题】:Seed DB in Laravel 6+ with fixed datasetsLaravel 6+ 中具有固定数据集的种子数据库
【发布时间】:2020-05-23 00:23:15
【问题描述】:

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


    【解决方案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,
                ]);
            });
        }
    }
    

    【讨论】:

    • 感谢您的想法,我试过了,但遗憾的是它不起作用,因为 Faker 会生成“名称”而不是数组中的城市。
    • @lordZ3d 也许您应该在 City 模型的可填充数组中添加 name 属性以使该解决方案起作用
    【解决方案2】:

    您可以在 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 提供的解决方案会更好,更符合语义。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-02-04
        • 2017-01-30
        • 2018-11-10
        • 1970-01-01
        • 2014-11-21
        • 2019-08-31
        • 1970-01-01
        • 2016-07-13
        • 2014-12-18
        相关资源
        最近更新 更多