Laravel foreaching 随机模型

Laravel foreaching random models

我正在为 M:M 关系制作播种机,我想在 90% 的情况下将 1 Widget 附加到 WorkspaceItem,其他 5% 2,最后 5% 3 .

$widgets = Widget::all();
$workspaceItems = WorkspaceItem::all();

foreach ($workspaceItems as $workspaceItem) {
    $numberBetween = $faker->numberBetween(0, 100);

    if ($numberBetween > 95) {
        $widgetsToSeed = $widgets->random(3);
    } else if ($numberBetween > 90 && $numberBetween <= 95) {
        $widgetsToSeed = $widgets->random(2);
    } else {
        $widgetsToSeed = $widgets->random();
    }

    foreach ($widgetsToSeed as $widget) {
        $workspaceItem->widgets()->attach($widget->id, [...]);
    }
}

注意:我不能使用sync(),因为我有其他的枢轴属性table。

如果我dd($widgetsToSeed),我确实会得到随机的小部件。但是一旦它进入循环,我 dd($widget) 我就没有得到模型,而只是 true。好像是什么问题?

我认为你应该可以做到:

$workspaceItem->widgets()->saveMany($widgetsToSeed);

这样你甚至不需要最后一个 foreach 循环。要始终接收一个集合(即使只有一个元素),您还可以在最后一个 else 语句中添加 random(1)。通过一些小的简化,它可能看起来像这样:

foreach ($workspaceItems as $workspaceItem) {
    $numberBetween = $faker->numberBetween(0, 100);

    if ($numberBetween > 95) {
        $widgetsToSeed = $widgets->random(3);
    } else if ($numberBetween > 90) {
        $widgetsToSeed = $widgets->random(2);
    } else {
        $widgetsToSeed = $widgets->random(1);
    }

    $workspaceItem->widgets()->saveMany($widgetsToSeed);
}