我有一个由 Vue 和 Vue Isotope 加载的新闻页面。Vue isotope 要求我的数据是一个数组,以便当用户单击“加载更多”按钮时,我可以将更多文章附加到同位素。它的工作方式是,当用户单击“加载更多”时,使用 Laravel 的分页功能,我可以简单地将下一个加载的文章附加到我的 Vue 实例中现有的文章数组中。
我遇到的问题是我的 Laravel 集合总是返回一个对象而不是数组,即使我使用toArray()
.
如果我直接从 eloquent using 加载我的文章get()
,这可以正常工作并且是一个数组,但是因为我需要将多个 eloquent 查询合并在一起,我不得不使用一个集合merge()
并将 4 个 eloquent 查询合并到一个大集合中。这就是我认为强制集合始终作为对象返回的原因。
以下是控制器的功能:
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
]))
},
因为响应是一个对象,所以 usingthis.list.push()
不起作用并抛出错误,因为this.list
应该是一个数组。
此外,这是我的 Vue 数据对象的片段
data: {
page: "{{route('api-news')}}",
list: [
],
paginatedList: [
],
},
我的列表对象的图像(其中列表应该是一个数组):
我如何能够强制$allPosts
作为数组返回?