Laravel - Коллекция Shuffle Merge and Paginate - PullRequest
0 голосов
/ 14 июня 2019

Я борюсь с довольно сложной вещью и надеюсь, что вы мне поможете.Прямо сейчас у меня есть следующее:

$ads = Ad::where('status', 1)
    ->whereIn('ad_type', [1, 2, 3])
    ->where('expire_at', '>', date('Y-m-d H:i:s'))
    ->where('special_ad', 'standard_ad')
    ->orderByRaw(DB::raw("FIELD(ad_type,2,3,1)"));

Информация : это работает, потому что это Eloquent Collection, и я могу разбить на страницы это (необходимо для моего Infinite Scroll)

Но теперь я хочу перемешать сами по себе ad_types , что означает: ad_type 1 может иметь, скажем, 30 записей.Все они будут возвращены в обычном порядке.Я хочу перетасовать эти 30 каждый раз, когда я запускаю этот запрос.Я думал о выполнении -> toArray ();но опять же, нет нумерации страниц (нумерация страниц работает только на Eloquent Queries, верно?)

Тогда я подумал: эй, давайте объединим это.Но как только я это сделал, возвращаемая коллекция уже не является Eloquent Collection, а является коллекцией поддержки (верно? Я не уверен на 100%, что это коллекция поддержки), поэтому разбиение на страницы больше не работает.

Я прочитал много постов о том, как решить эту проблему, и выяснил, что одним из решений может быть «создание собственного экземпляра paginator». Но, черт возьми, я еще не так хорош.Я действительно не знаю, даже после изучения документации по laravel, как создать свой собственный paginator.

Важная информация, которая может вам понадобиться: Использование Laravel 5.2 $ads является динамическим, то есть зависит отВ этом случае запросы, отправленные с помощью Ajax, могут отличаться на более позднем этапе (что-то может быть включено).

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

Приветствую вас и хороших выходных всем вам.

1 Ответ

1 голос
/ 14 июня 2019

Во-первых, просто обратите внимание: разбиение на страницы работает не только для запросов к базе данных.Вы можете вручную разбить на страницы, используя LengthAwarePaginator, но вручную здесь используется ключевое слово.Построитель запросов (не Eloquent) может сделать это автоматически, используя paginate.

Вы можете "перемешать" результаты, выполнив что-то вроде

$ads = Ad::where('status', 1)
   ->whereIn('ad_type', [1, 2, 3])
   ->where('expire_at', '>', date('Y-m-d H:i:s'))
   ->where('special_ad', 'standard_ad')
   ->orderByRaw("FIELD(ad_type,2,3,1)")
   ->orderByRaw("RAND()");

Это упорядочит сначала по полю ad_type и упорядочит по случайному числу (разному для каждой строки) в качестве вторичной сортировки..

...