Laravel выборка случайных моделей - PullRequest
3 голосов
/ 03 августа 2020

Я делаю сеялки для отношения M: M, где я хотел бы присоединить 1 Widget к WorkspaceItem в 90% случаев, другие 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(), потому что у меня есть дополнительные свойства для сводной таблицы.

Если я dd($widgetsToSeed), я действительно получаю случайные виджеты. Но как только он входит в l oop и я dd($widget), я не получаю модель, а просто true. В чем, кажется, проблема?

1 Ответ

5 голосов
/ 03 августа 2020

Я думаю, вы должны уметь просто:

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

И при этом вам даже не понадобится последний foreach l oop. Чтобы всегда получать коллекцию (даже с одним элементом), вы также можете добавить 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);
}
...