我定义了一个工厂,以便为 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文档没有提及。但是以这种方式,它引发了另一个异常:
此集合实例上不存在属性[id]。
如果迁移结果如下:
Schema::create('componente', function (Blueprint $table) {
$table->increments('id'); // <- ID exists!
$table->string('tipo');
[...] // Other stuff
}
关于这一点,我了解了集合规范,即first()
的使用。但是我不知道如何避免这种情况。我的意思是,如果我在语句中使用first()
,如果first()
仅返回第一次出现的集合,它将如何生成所需的行数?
最后,我只需要创建3行,那么我该如何处理呢?
预先感谢大家的帮助。
更新
这是 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
];
});
答案 0 :(得分: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%的关系将终止链。