Объедините две красноречивые коллекции в одну коллекцию и разбивайте на страницы - PullRequest
0 голосов
/ 29 марта 2019

У меня есть новостной сайт с обзором постов на главной странице.Простая коллекция Eloquent с нумерацией страниц, ничего особенного, если честно (model = Post).Теперь добавлена ​​новая модель (видео), которую следует добавить к обзору постов на главной странице.

Таким образом, цель состоит в том, чтобы получить красноречивую коллекцию постов и красноречивую коллекцию видео(которые не связаны друг с другом), затем объедините их в одну коллекцию и разбейте на страницы.

Я осмотрелся и попробовал несколько вещей, но ни одна из них, похоже, не работает.В большинстве случаев они говорят, что используют $collection->merge($otherCollection), но это не работает, так как видео с идентификатором 1 не будет отображаться, если есть сообщение с таким же идентификатором, что и будет.

AnДругим вариантом было определить отношения, но поскольку они вообще не связаны, это тоже не сработает.

То, что у меня есть на данный момент, просто чтобы получить сообщения:

if ($highlighted) {
    $posts = Post::where([
        ['status_id', '=', 4],
        ['published_at', '<=', Carbon::now()],
        ['id', '!=', $highlighted->id],
     ])->latest('published_at')->paginate(14);
} else {
     $posts = Post::where([
         ['status_id', '=', 4],
         ['published_at', '<=', Carbon::now()]
     ])->latest('published_at')->paginate(15);
}

Теперь я хочу получить видео аналогичным образом

$videos = Video::where([
    ['status_id', '=', 4],
    ['published_at', '<=', Carbon::now()]
])->latest('published_at')->paginate(15);

, а затем объединить их в одну коллекцию Eloquent и разбить на страницы итоги вместо видео и записей отдельно

Что-то вроде:$collected = $videos + $posts, а затем ->latest('published_at')->paginate(15)

(я не добавил ни одного примера того, что я пробовал ради длины этого поста, и, поскольку я чувствую, что это не тот путь, используя ->merge(). Также мне нужна красноречивая коллекция, использование чистых запросов к БД не работает, если только это не может быть преобразовано в коллекцию Eloquent)

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

Любая обратная связь / помощь очень ценится.(Не стесняйтесь спрашивать дополнительный код / ​​информацию)

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Вы можете отправить два разных запроса, объединить два результата в Illuminate\Support\Collection, затем sortBy('published_at'), а затем использовать skip(($numPage - 1) * $perPage) и limit($perPage) для разбивки на страницы.

Дайте мне знать, помогло ли это

0 голосов
/ 01 апреля 2019

Благодаря комментариям и ответам, размещенным здесь, мне удалось найти решение, которое, кажется, работает:

Для извлечения данных я сделал следующее:

$posts = Post::where([
    ['status_id', '=', 4],
    ['published_at', '<=', Carbon::now()]
])->get();
$videos = Video::where([
    ['status_id', '=', 4],
    ['published_at', '<=', Carbon::now()]
])->get();

$collected = $videos->union($posts)->sortByDesc('published_at');

Как упоминалось впрокомментируйте этот вопрос: https://stackoverflow.com/a/30421846/4666299 Я использовал https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e для нумерации страниц.

Таким образом, я мог бы просто тогда сделать:

$items = (collect($collected))->paginate(15);

Теперь у меня естьединую коллекцию, которую я могу перебрать в Blade.Спасибо за помощь!

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