php - Laravel 5.6 - 工厂关系无限播种
问题描述
我定义了一个工厂,以便用faker播种表。按照官方文档,我按照所示实现了它,如下所示:
<?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
];
});
解决方案
问题来自你们的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% 会停止链。
推荐阅读
- web-services - 如何在 Kong Gateway 后面保护公共和内部流量的 API
- mysql - Mysql 如果不可用则插入,如果部分可用则更新,如果完全可用则退出
- javascript - 将插入到 Flatlist 中的卡路里的总值相加
- python - 在使用 python 多处理时使用 pool.map 时是否有理由调用 join ?
- javascript - NodeJS 使用 Express,错误:getaddrinfo ENOTFOUND https
- java - IntelliJ IDEA - 获取无法解析“字符串”中的方法“isBlank”但在 STS 中工作正常
- python - 分析代码以使其易于理解
- json - 使用 Pandas Excelwriter 在 Excel 中未正确格式化 JSON 输入日期时间
- php - 阿拉伯语和印地语数据未正确显示 PHP
- jquery - 单击提交并从 datepicker jquery 验证消息中选择日期后仍然显示