【问题标题】:Seed multiple custom rows/entries in ModelFactory Laravel在 ModelFactory Laravel 中播种多个自定义行/条目
【发布时间】:2018-03-07 07:07:13
【问题描述】:

如何在 Laravel 中使用 ModelFactory 播种多行?

ModelFactory.php里面我有如下代码:

$factory->define(App\User::class, function (Faker $faker) {
    static $password;

    return [
        'name' => 'Admin',
        'Description' => 'Administrators have full access to everything.'
    ];
});

如何在不使用原始表达式的情况下添加以下数组?

[
    'name' => 'Admin',
    'description' => 'Administrators have full access to everything.',
],
[
    'name' => 'User',
    'description' => 'User have normal access.',
],

谢谢

【问题讨论】:

  • 您可以使用defineAs和state来创建不同类型的用户。像这样:$factory->state(App\User::class, 'admin', function...

标签: php laravel eloquent


【解决方案1】:

假设您想在数据库中添加 100 个用户。

database/factories 中创建UserFactory.php

<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {

    return [
        'name' => 'Admin',
        'Description' => 'Administrators have full access to everything.'
    ];
});

然后,在database/seeds/DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\User::class, 100)->create();
    }
}

您可以找到更多详细信息about seeding in the Laravel official documentation

【讨论】:

  • 但这不允许您播种自定义数据,您有 100 个假数据条目。
  • 如果你想要自定义数据,你将不得不“手动”编写它们。
【解决方案2】:

如果你想有一两列有自定义数据,你可以在创建条目后使用each函数。

$names = ['admin', 'user', 'author', 'subscriber'];

factory(App\User::class, 100)->create()->each(function () use ($names) {
     $user->name = $names[array_rand($names)];
     $user->save();
});

*注意:在每个函数中使用您自己的逻辑来提供自定义数据。

【讨论】:

    【解决方案3】:

    比 Raghavendra 的提议更简洁的方法(每个名称创建一个条目):

    $names = ['admin', 'user', 'author', 'subscriber'];
    
    collect($names)->each(function($name) {
        App\Models\User::factory()->create($name);
    });
    

    【讨论】:

      【解决方案4】:

      你可以使用序列()

      User::factory()->count(2)->sequence(['name' => 'admin'],['name' => 'user'])
      ->create()
      

      来自 laravel 文档的示例

      $users = User::factory()
                  ->count(10)
                  ->sequence(fn ($sequence) => ['name' => 'Name '.$sequence->index])
                  ->create();
      

      来源https://laravel.com/docs/8.x/database-testing#sequences

      【讨论】:

        猜你喜欢
        • 2017-07-21
        • 2018-06-22
        • 2017-12-08
        • 2016-05-17
        • 2020-02-27
        • 2021-11-14
        • 2018-09-06
        • 2015-04-20
        • 1970-01-01
        相关资源
        最近更新 更多