首页 文章

Laravel 5.6 - 工厂关系无限种子

提问于
浏览
2

我定义了一个工厂,以便与faker种子表 . 在official docs之后,我实现了它,如下所示:

<?php

use Faker\Generator as Faker;

$factory->define(App\Item::class, function (Faker $faker) {
    return [
        'codice' => $faker->word,
        'data_acquisto' => $faker->date('Y-m-d'),
        [...] // Other stuff
        // Relations
        'componente_id' => function() {
            return factory(App\Componente::class)->create()->id;
        },
    'tipologia_id' => function() {
        return factory(App\Tipologia::class)->create()->id;
    },
    'condizione_id' => function() {
        return factory(App\Condizione::class)->create()->id;
    },
    'locazione_id' => function() {
        return factory(App\Locazione::class)->create()->id;
    },
    'fornitore_id' => function() {
        return factory(App\Fornitore::class)->create()->id;
    },
    'parent_id' => function() {
        return factory(App\Item::class)->create()->id;
    }
     ];
 });

当我使用 php artisan migrate:refresh --seed 启动它时,框架开始播种目标表,但它停留在关系播种阶段( factory(App\Componente::class)->create()->id ) . 显然导致某种无限/递归过程(生成数千条记录),直到任务因溢出而崩溃 .

通过谷歌搜索,我注意到来自许多开发者的不同方法,但似乎其他人像我一样经历过这个问题 . 有人试图在工厂参数中指出最大数量:

// Ex. 5 max
return factory(App\Componente::class, 5)->create()->id;

Laravel文档没有提到它 . 但就这样,它引发了另一个例外:

此集合实例上不存在Property [id] .

如果迁移结果如下:

Schema::create('componente', function (Blueprint $table) {
    $table->increments('id'); // <- ID exists!
    $table->string('tipo');
    [...] // Other stuff
}

关于这一点,我读到了关于集合规范,即使用 first() . 但我不知道如何避免这种情况 . 我的意思是,如果我在语句中使用 first() ,如果 first() 仅返回第一个集合出现,它如何生成所需行数?

最后,我只需要创建这一行的3行,那么我该如何处理呢?

在此先感谢大家的帮助 .

UPDATE

这是 ComponenteFactory.php

<?php

use Faker\Generator as Faker;

// Definizione dati test
$factory->define(App\Componente::class, function (Faker $faker) {
    return [
        'tipo' => $faker->word,
        'descrizione' => $faker->optional()->sentence,
        'garanzia' => $faker->optional()->text,
        'note' => $faker->optional()->sentence
    ];
});

1 回答

  • 1

    问题来自你的 parent_id 关系 .

    return factory(App\Item::class)->create()->id;
    

    由于父项是另一项,它将创建父项并继续在父项后为新项创建父项,这将导致无限循环 .

    要解决此问题,您可以使用随机因子来查看是否生成父级 .

    例如:

    'parent_id' => function () {
        return mt_rand(0, 100) % 2 == 0 ? factory(App\Item::class)->create()->id : null;
    }
    

    因此,在生成父关系时,有50%会停止链 .

相关问题