如何在 laravel 8 中使用不同的数据透视表播种多个多对多关系?

How to seed multiple many-to-many relationships with different pivot data in laravel 8?

我知道我可以使用 hasAttached 方法来 create many-to-many relationships with pivot data in Laravel 8:

  Meal::factory()
        ->count(3)
        ->hasAttached(Ingredient::factory()->count(3), ['gram' => 100])
        ->create();

有没有任何方便的 way(除了编写自定义的 for 循环)用每个随机数据为枢轴 table 播种附加条目? 我希望 'gram' 是每个已创建关系的随机数。我尝试了以下但 rand 表达式只被评估一次并用每个关系的相同条目填充枢轴 table:

Meal::factory()
        ->count(3)
        ->hasAttached(Ingredient::factory()->count(3), ['gram' => rand(1,100]) //not working
        ->create();

编辑:我基本上是想实现

for ($i = 1; $i <= 3; $i++) {
        $meal = Meal::factory()->create();

        for ($j = 1; $j <= 3; $j++) {
            $ingredient = Ingredient::factory()->create();
            $meal->ingredients()->save($ingredient, ['gram' => rand(5, 250)]);
        }
    }

使用 Laravel 流畅的工厂方法。

当您调用这样的方法时 method(rand(1,100)) rand 会在调用之前进行评估。这将与 method(59)

相同

幸运的是,Laravel 允许您在每次调用时使用回调 re-evaluate 参数,

Meal::factory()
        ->count(3)
        ->hasAttached(Ingredient::factory()->count(3), fn => ['gram' => rand(1,100)])
        ->create();

如果您使用低于 7.4 的 PHP 版本,您将无法使用箭头功能,您将不得不这样做

Meal::factory()
        ->count(3)
        ->hasAttached(Ingredient::factory()->count(3), function () { 
            return ['gram' => rand(1,100)]; 
        })
        ->create();