【发布时间】:2018-07-20 13:59:24
【问题描述】:
我定义了一个工厂,以便用 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)。显然会导致某种无限/递归过程(生成数千条记录),直到任务因溢出而崩溃。
通过谷歌搜索,我注意到许多开发人员的不同方法,但似乎其他人也像我一样遇到过这个问题。有人试图在 factory 参数中指明最大数量:
// 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
];
});
【问题讨论】:
-
你能告诉我们你的
App\Componente工厂吗? -
嗨@chin,我在上面的问题中添加了它。
-
您确定它卡在与组件的关系中吗?你能告诉我们你的
App\Item工厂的其他关系吗? -
我添加了它们。不知道,它在各个方面都卡住了,我也尝试排除其他方面,结果相同。我刚刚注意到,如果我设置了记录的限制数量,它会正确生成它们但会抛出缺少的属性异常