在ModelFactory Laravel中种植多个自定义行/条目

6

我该如何在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... - Michael K.
4个回答

5

您可以使用sequence()函数

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

在Laravel的数据库测试中,序列(sequence)是一个用于生成唯一ID的方法。当您在测试中创建模型并将其保存到数据库中时,Laravel会自动为该模型分配一个唯一的ID。但是,在某些情况下,您可能需要手动控制生成的ID序列,这就是Laravel提供了Sequence的原因。 Sequence允许您在测试过程中手动指定ID值,以便更好地控制测试数据的生成。

1
谢谢,我之前不知道有序列这个概念。 - Lulu

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

你可以在Laravel官方文档的有关种子数据的章节中找到更多细节。


2
但这并不允许您种植自定义数据,您只能获得100个虚假数据条目。 - Nucleus
1
如果您想要自定义数据,您将不得不手动编写它们。 - louisfischer

0
比Raghavendra提出的方案(每个名称创建一个条目)更清晰的方法:
$names = ['admin', 'user', 'author', 'subscriber'];

collect($names)->each(function($name) {
    App\Models\User::factory()->create($name);
});

0
如果您想要为一个或两个列添加自定义数据,可以在创建条目后使用each函数。
$names = ['admin', 'user', 'author', 'subscriber'];

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接