工厂的增量编号,Laravel
Posted
技术标签:
【中文标题】工厂的增量编号,Laravel【英文标题】:Incremental number on factory, Laravel 【发布时间】:2021-01-22 07:39:18 【问题描述】:我有一个被多次调用的工厂,但在 contract_year
列上我得到了相同的值。
$factory->define(ContractYear::class, function (Faker $faker)
$contract = Contract::orderByDesc('id')->first();
$contract_year = ContractYear::select('contract_year')->orderByDesc('id')->value('contract_year');
if($contract_year == null)
$contract_year = 2019;
return [
'contract_id' => $contract->id,
'contract_year' => $contract_year++,
'licensed_users' => $faker->randomDigit,
];
);
我从这里调用它..
$u->contracts()->saveMany(factory(Contract::class, rand(1, 5))->create()->each(function ($contract)
$contract->years()->saveMany(factory(ContractYear::class, $contract->number_of_years)->create());
));
【问题讨论】:
这不会起作用,除非你一次运行一次工厂。工厂正在批量插入,因此每个 $contract_year 将为空,然后是 2019 年,然后是 2020 年 ++。 【参考方案1】:你可以使用static
$factory->define(ContractYear::class, function (Faker $faker)
static $contract_year;
$contract = Contract::orderByDesc('id')->first();
if(!$contract_year)
$contract_year = ContractYear::select('contract_year')->orderByDesc('id')->value('contract_year') ?? 2019;
return [
'contract_id' => $contract->id,
'contract_year' => $contract_year++,
'licensed_users' => $faker->randomDigit,
];
);
参考:`static` keyword inside function?
【讨论】:
我试过这个,我得到“常量表达式包含无效操作” 你只写了static
,而不是public static
对吧?另外,尝试将static $contract_year = 2019;
放在$contrat = ...
之前并删除= ContractYear::...
以查看这是否有效?我的一个项目中正好有这个,它正在工作。
是的,这样我就不会出错,但增量是针对每个合同的。因此,如果我有 4 行的 1 份合同都是(2019 年、2019 年……),而在下一份合同中我得到(2020 年)……等等。对于同一个合同来说不是增量的。
我已经更新了我的答案。试试这个方法。 IRC 正确地声明变量属性时不能分配变量或函数结果。
我没有收到任何错误,但增量是针对每个合同完成的,而不是针对分配给合同的每一行,就像我上面描述的那样。【参考方案2】:
将计数器附加到$this
$factory->define(ContractYear::class, function (Faker $faker)
$this->sequences = $this->sequences ?? [];
$contract = Contract::orderByDesc('id')->first();
$group = $contract->id ?? 0;
$this->sequences[$group] = $this->sequences[$group] ?? 2019;
return [
'contract_id' => $contract->id,
'contract_year' => $this->sequences[$group]++,
'licensed_users' => $faker->randomDigit,
];
);
可能值得研究 Laravel 8 新的模型工厂以获得更明确的面向对象方法
【讨论】:
我收到此错误:“未定义属性:Illuminate\Database\Eloquent\Factory::$contract_year” 好的,差不多了。增加,但对于所有合同,在下一个合同时不会重置为 2019 年。如何将 2019 年设置为每个合同的第一个值? @Beusebiu 知道了 其中一些是好的,一些仍然是增量的(例如:2025)。前三份合同还可以,第四份是2023年开始的,第五份还可以,奇怪的行为。以上是关于工厂的增量编号,Laravel的主要内容,如果未能解决你的问题,请参考以下文章