Сбор срезов несколько раз - PullRequest
1 голос
/ 29 июня 2019

У меня есть коллекция с кучей данных.

Я пытаюсь сделать следующее

  • получить первые 18 результатов и выплюнуть их
  • получить первые 3 результата для конкретного случая с использованием цикла и выплюнуть каждый из них

Вот пример кода того, что я пытаюсь сделать:

$data = DataChampion::query()
    ->selectRaw('
        static_champions.name as champion_name, static_champions.slug as champion_slug, static_champions.image as champion_image,
        static_lanes.slug as lane_slug, static_tiers.slug as tier_slug, static_patches.slug as patch_slug,
        ((sum(data_champions.wins) / sum(data_champions.matches)) * 100) as win_rate
    ')
    ->leftJoin('static_champions', 'static_champions.id', 'data_champions.static_champion_id')
    ->leftJoin('static_lanes', 'static_lanes.id', 'data_champions.static_lane_id')
    ->leftJoin('static_tiers', 'static_tiers.id', 'data_champions.static_tier_id')
    ->leftJoin('static_patches', 'static_patches.id', 'data_champions.static_patch_id')
    ->where('data_champions.static_patch_id', StaticPatch::orderByDesc('id')->first()->id)
    ->groupBy('data_champions.static_champion_id')
    ->orderByDesc('win_rate')
    ->get();

foreach ($data->splice(0, 18) as $data) {
    echo $data->champion_name . '<br>';
}

foreach (['top', 'middle', 'bottom'] as $lane_slug) {
    foreach ($data->where('lane_slug', $lane_slug)->splice(0, 3) as $data) {
        echo $lane_slug . ' - ' . $data->champion_name . '<br>';
    }
}

Я сохраняюполучая ошибку:

вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: splice ()

Когда я удаляю весь цикл foreach (['top', 'middle'..., кажется, чтоработать для первых 18 результатов.

Как получить нужные данные из одной коллекции, чтобы мне не приходилось использовать несколько запросов с одинаковыми данными?

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Измените несколько строк, как показано ниже - Вы не можете использовать одно и то же имя переменной во время итерации коллекции (например, $ data).

foreach ($data->splice(0, 18) as $val) {
    echo $val->champion_name . '<br>';
}

foreach (['top', 'middle', 'bottom'] as $lane_slug) {
    foreach ($data->where('lane_slug', $lane_slug)->splice(0, 3) as $val) {
        echo $lane_slug . ' - ' . $val->champion_name . '<br>';
    }
}
0 голосов
/ 29 июня 2019

может быть, потому что вы добавляете где в этом foreach, коллекция становится для построителя запросов, попробуйте добавить -> get () после того, где

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...