Как сделать так, чтобы запрос по 3 включался в модель Laravel Eloquent без foreach - PullRequest
0 голосов
/ 26 мая 2018

Есть ли способ удалить из этого кода до foreach?

    $user = \Auth::user();
    foreach ($user->categories as $category) {
        $channels[] = $category->channel();
    }
    return $channels;

Я хочу использовать функцию разбивки на страницы, но это невозможно с foreach!

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Документация по Lagvel paginator немного короткая, особенно с созданием / разбиением на страницы вручную, как вам придется сделать ... вот краткий обзор того, как они работают, как заставить их работать ...

Никакой магии, пагинаторы будут вызывать функцию вашего контроллера для каждой страницы.Запрос будет содержать информацию о нумерации страниц.Это ваша работа на самом деле выбрать и нарезать страницу.Пагинатор просто представляет это ... что является большой частью работы ...

Ваш массив $ channel [] должен быть разрезан и возвращен должным образом ... что-то вроде этого ...

public function channels(){

    // we have to build the paginator ourselves, your result is an array...
    $user = \Auth::user();
    foreach ($user->categories as $category) {
        $channels[] = $category->channel();
    }

    // this basically gets the request's page variable...This is how pagination works under the hood... we defaults to 1
    $page = Paginator::resolveCurrentPage('page') ?: 1;

    // Assume 15 items per page... so start index to slice our array
    $startIndex = ($page - 1) * 15;

    // Length aware paginator needs a total count of items... to paginate properly
    $total = count($channels);

    // Eliminate the non relevant items... We have to slice the array ourselves...
    $results = array_slice($channels, $startIndex, 15);

    $paginatedChannels =  new LengthAwarePaginator($results, $total, 15, $page, [
        'path' => Paginator::resolveCurrentPath(),
        'pageName' => 'page',
    ]);
    return view('yourViews', compact('paginatedChannels'));
}

Суть в том, что вы должны самостоятельно подготовить срез данных ...

Вы можете опубликовать свою структуру данных, чтобы мы могли найти лучшую альтернативу самому запросу ... ноэто должно работать, если эта функция $ category-> channel () работает ...

0 голосов
/ 26 мая 2018

А как же так?

$categories = \Auth::user()->categories()->pluck('id')->toArray();
return \App\Channel::wherein('category_id', $categories)->paginate();
0 голосов
/ 26 мая 2018

Eloquent не выполняет запросы JOIN, если вам действительно нужно JOIN, вам нужно перейти к построителю запросов и написать запрос самостоятельно.

Если, однако, вы просто пытаетесьчтобы избежать проблемы N + 1, вы должны использовать энергичную загрузку.Это создаст 1 дополнительный WHERE foreign_id IN(...) запрос для каждого типа отношений.Таким образом, всего будет:

  • 1 запрос на выборку записи пользователя
  • 1 запрос на выборку всех категорий, принадлежащих пользователю
  • 1 запрос на выборкувсе каналы, которые принадлежат к любой из ранее выбранных категорий

Поскольку у вас уже есть экземпляр пользователя в памяти, вы можете избежать повторной выборки пользовательской записи с помощью отложенная загрузка .

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