工厂的增量编号,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的主要内容,如果未能解决你的问题,请参考以下文章

如何将增量发票编号放入 DatabaseReference

使用 VBA 的增量发票编号 - 访问

如何在猫鼬中插入自动增量编号

如何使用数据工厂将数据从 Azure Blob 存储增量加载到 Azure SQL 数据库?

plist中的增量编号

带增量编号的加特林进料器(非随机)