У меня есть страница новостей, которая загружается Vue и Vue Isotope.Vue isotope требует, чтобы мои данные были массивом, чтобы я мог добавлять больше статей к изотопу, когда пользователь нажимает кнопку «Загрузить еще».Это работает так: когда пользователь нажимает «загрузить больше», используя функцию разбиения на страницы Laravel, я могу просто добавить следующую загрузку статей в мой существующий массив статей в моем экземпляре Vue.
Проблема, с которой я столкнулся, заключается в том, что моя коллекция Laravel всегда возвращает объект, а не массив, даже когда я использую toArray()
.
Если я загружаю свои статьи прямо из eloquent, используя get()
, это нормально работает и представляет собой массив, однако, поскольку мне нужно объединить несколько красноречивых запросов, я вынужден использовать коллекцию и merge()
дляобъединить 4 красноречивых запроса в одну большую коллекцию.Я верю, что это заставляет коллекцию всегда возвращаться как объект.
Ниже моя функция от контроллера:
public function apiIndex()
{
$articles = Article::latest('featuredArticle')->latest()->published()->get();
$twitterPosts = TwitterPost::where('published', 'published')->get();
$facebookPosts = FacebookPost::where('published', 'published')->get();
$vimeoPosts = VimeoPost::where('published', 'published')->get();
$articles->map(function ($post) {
$post['type'] = 'Article';
return $post;
});
$twitterPosts->map(function ($post) {
$post['type'] = 'Twitter';
return $post;
});
$facebookPosts->map(function ($post) {
$post['type'] = 'Facebook';
return $post;
});
$vimeoPosts->map(function ($post) {
$post['type'] = 'Vimeo';
return $post;
});
$allPosts = collect();
$allPosts = $allPosts->merge($articles);
$allPosts = $allPosts->merge($twitterPosts);
$allPosts = $allPosts->merge($facebookPosts);
$allPosts = $allPosts->merge($vimeoPosts);
$allPosts = $allPosts->sortByDesc('created_at')->paginate(15);
return response()->json($allPosts);
}
Самое близкое, что мне удалось получить, это добавить ->values()
в конец $allPosts
, однако это удаляет ссылку на пагинациюдля следующей страницы и извлекает только реальные сообщения, поэтому я не могу использовать это.
Вот небольшой фрагмент для извлечения исходных $allPosts
данных в Vue
mounted () {
axios.get(this.page)
.then(response => ([
this.list = response.data.data,
this.page = response.data.next_page_url
]))
},
Вот фрагменткакого метода вызывается, когда пользователь нажимает кнопку «Загрузить еще»
loadMore: function() {
axios.get(this.page)
.then(response => ([
this.paginatedList = response.data.data,
this.list.push(this.list, this.paginatedList),
this.page = response.data.next_page_url
]))
},
Поскольку ответ является объектом, использование this.list.push()
не работает и выдает ошибку, так как this.list
должен быть массивом,
Кроме того, здесь приведен фрагмент моего объекта данных Vue
data: {
page: "{{route('api-news')}}",
list: [
],
paginatedList: [
],
},
Изображение моего объекта списка (вместо которого список должен быть массивом):
![enter image description here](https://i.stack.imgur.com/BC4fE.png)
Как мне заставить $allPosts
возвращаться как массив?