【发布时间】:2019-05-18 01:45:24
【问题描述】:
我有一个由 Vue 和 Vue Isotope 加载的新闻页面。 Vue isotope 要求我的数据是一个数组,以便当用户单击“加载更多”按钮时,我可以将更多文章附加到同位素。它的工作方式是,当用户单击“加载更多”时,使用 Laravel 的分页功能,我可以简单地将下一个加载的文章附加到我的 Vue 实例中现有的文章数组中。
我遇到的问题是我的 Laravel 集合总是返回一个对象而不是一个数组,即使我使用 toArray()。
如果我使用 get() 直接从 eloquent 加载我的文章,这可以正常工作并且是一个数组,但是因为我需要将多个 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 的末尾,但是这会删除下一页的分页链接,并且只检索实际的帖子,所以我不能使用它。
这是一个小 sn-p,用于将初始 $allPosts 数据检索到 Vue 中
mounted () {
axios.get(this.page)
.then(response => ([
this.list = response.data.data,
this.page = response.data.next_page_url
]))
},
这里是当用户点击“加载更多”按钮时调用什么方法的 sn-p
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 数据对象的 sn-p
data: {
page: "{{route('api-news')}}",
list: [
],
paginatedList: [
],
},
我的列表对象的图像(其中列表应该是一个数组):
如何强制$allPosts 作为数组返回?
【问题讨论】:
-
你能分享一下
list内容的sn-p吗? -
试试
$allPosts->toArray() -
@adam 这个我试过了,没区别。
-
@BoussadjraBrahim 已编辑帖子以附加图片。如您所见,列表是一个对象,但它必须是一个数组。不过需要注意的是,
list中的项目可以作为对象,但是list本身需要是一个数组。 -
list 是一个对象,因为您有一个
list的键。删除list作为键,您将拥有一个基于 0 的索引数组。
标签: php laravel laravel-5 vue.js