向 Laravel 9 工厂传递参数

3

我需要在数据库中添加不同语言的行。例如,我有模型Books,包括字段titlecontentlanguage_id。还有一个包含语言信息的模型Languages

Schema::create('languages', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('code', 2);
    $table->timestamps();
});
Schema::create('books', function (Blueprint $table) {
    $table->id();
    $table->foreignId('language_id');
    $table->string('title');
    $table->text('content');
    $table->timestamps();

    $table->foreign('language_id')->references('id')->on('languages')->onUpdate('cascade')->onDelete('cascade');
});

我创建了一个BookFactory

class BookFactory extends Factory
{
    public function definition()
    {
        return [
            'title' => fake()->sentence(rand(3, 7)),
            'content' => fake()->sentences(rand(5, 11))
        ];
    }
}

我可以将语言参数传递给fake()函数,例如fake('de_DE')。我该如何将区域设置代码(如de_DE等)从种子传递到工厂?
class DatabaseSeeder extends Seeder
{
    public function run()
    {   
        \App\Models\Book::factory(10)->create();
    }
}
2个回答

3

您不能将地域设置代码从Seed传递到工厂,但如果您想使您的工厂动态化,可以创建一个state()

class BookFactory extends Factory
{
    public function definition()
    {
        return [
            'title' => fake()->sentence(rand(3, 7)),
            'content' => fake()->sentences(rand(5, 11))
        ];
    }

    public function setLanguage(string $locale)
    {
        return $this->state(fn (array $attributes) => [
            'title' => fake($locale)->sentence(rand(3,7)),
            'content' => fake($locale)->realText(500), // you can use real text so that it will display a real text snippet.
        ])
    }
}

那么如果您想使用它:

class DatabaseSeeder extends Seeder
{
    public function run()
    {   
        \App\Models\Book::factory(10)->setLanguage('de_DE')->create();
    }
}

1
您可以使用以下代码片段来解决此问题:
Book::factory(10, ["locale" => 1])->create();

通过使用 states 属性从工厂获取区域设置:

$this->states[1]["locale"]

请参考工厂状态文档进行实现。

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