Laravel foreaching 随机模型

Nor*_*gul 3 php database seed laravel laravel-7

我对A M使播种机:M的关系,我想1安装WidgetWorkspaceItem90%的情况下,其他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, [...]);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我无法使用,sync()因为我有数据透视表的附加属性。

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

wsc*_*ohl 5

我认为你应该能够做到:

$workspaceItem->widgets()->saveMany($widgetsToSeed);
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)