Красноречивое слияние двух отношений - PullRequest
0 голосов
/ 25 мая 2018

У меня есть две модели: Task и Comment

В моем профиле пользователя я хочу отобразить сортировку задач и комментариев по дате создания.

Для этого я делаю:

$timeline_array = $customer->comments;
$timeline_array = $timeline_array->toBase()->merge($customer->tasks);

//sort timeline event
$timeline_array = $timeline_array->sortByDesc(function($timeline_event){
    return $timeline_event->created_at;
});

И я вижу свой массив в своем представлении.Это нормально работает, но если у меня слишком много комментариев или задач, это будет большой запрос, поэтому я хочу добавить paginator.

Как я могу это сделать?

Если у меня было $timeline_array->paginate(5); в конце я получаю сообщение об ошибке:

Метод Illuminate \ Support \ Collection :: paginate не существует.

И я думаю, что это не решает мою проблему, потому что язагрузите все комментарии и задачи, прежде чем я разбью их на страницы.

У кого-нибудь есть идея / решение?

Ответы [ 2 ]

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

Наконец-то нашли решение:

$timeline_array = $customer->comments;
$timeline_array = $timeline_array->toBase()->merge($customer->tasks);

//sort timeline event
$timeline_array = $timeline_array->sortByDesc(function($timeline_event){
  return $timeline_event->created_at;
});

$item_per_page = 10;
$timeline_array = new LengthAwarePaginator($timeline_array->forPage(Paginator::resolveCurrentPage(), $item_per_page), count($timeline_array), $item_per_page, Paginator::resolveCurrentPage(), [
  'path' => Paginator::resolveCurrentPath()
]);
0 голосов
/ 25 мая 2018

Метод Paginate работает только на построителе запросов или eloquent, кто-то создал здесь суть, где вы можете использовать paginate для массива или коллекции:

https://gist.github.com/vluzrmos/3ce756322702331fdf2bf414fea27bcb

Попробуйте использовать его следующим образом:

$timeline_array = $customer->comments;
$timeline_array = $timeline_array->toBase()->merge($customer->tasks);

//sort timeline event
$timeline_array = $timeline_array->sortByDesc(function($timeline_event){
  return $timeline_event->created_at;
});

$timeline_array = $this->paginate($items);


public function paginate($items, $perPage = 15, $page = null, $options = [])
{
  $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
  $items = $items instanceof Collection ? $items : Collection::make($items);
  return new LengthAwarePaginator($items->forPage($page, $perPage), 
  $items->count(), $perPage, $page, $options);
}

Или добавьте его в качестве макроса для сбора в вашем поставщике услуг приложений для более эффективной практики.

...