1

我有一个被多次调用的工厂,但在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());            
}));
4

2 回答 2

0

附上一个计数器$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 新模型工厂以获得更明确的面向对象方法

于 2020-10-07T11:23:01.037 回答
0

您可以使用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`关键字?

于 2020-10-07T11:05:22.713 回答