Laravel foreaching random models

Viewed 67

I am making seeders for a M:M relation where I would like to attach 1 Widget to WorkspaceItem in 90% of cases, other 5% 2, last 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, [...]);
    }
}

Note: I can't use sync() because I have additional properties for pivot table.

If I dd($widgetsToSeed), I indeed get random widgets. But as soon as it enters the loop and I dd($widget) I don't get the model, but just true. What seems to be the problem?

1 Answers

I think you should be able to just do:

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

And by that you don't even need the last foreach loop. To always receive a collection (even with only one element), you can also add random(1) in your last else statement. With some minor simplifications it might look like this:

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);
}
Related