Php Laravel集合始终返回对象而不是数组
我有一个由Vue和Vue同位素加载的新闻页面。Vue同位素要求我的数据是一个数组,这样当用户单击“加载更多”按钮时,我可以向同位素添加更多文章。其工作方式是,当用户单击“加载更多”时,使用Laravel的分页功能,我可以简单地将下一次加载的文章附加到Vue实例中现有的文章数组中 我遇到的问题是,我的Laravel集合总是返回一个对象而不是数组,即使我使用Php Laravel集合始终返回对象而不是数组,php,laravel,laravel-5,vue.js,Php,Laravel,Laravel 5,Vue.js,我有一个由Vue和Vue同位素加载的新闻页面。Vue同位素要求我的数据是一个数组,这样当用户单击“加载更多”按钮时,我可以向同位素添加更多文章。其工作方式是,当用户单击“加载更多”时,使用Laravel的分页功能,我可以简单地将下一次加载的文章附加到Vue实例中现有的文章数组中 我遇到的问题是,我的Laravel集合总是返回一个对象而不是数组,即使我使用toArray() 如果我使用get()直接从eloquent加载文章,这很好,而且是一个数组,但是因为我需要将多个eloquent查询合并在一
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);
}
我能得到的最接近的方法是在$allPosts
的末尾添加->values()
,但是这会删除下一页的分页链接,只检索实际的帖子,因此我无法使用它
下面是一个小片段,用于将初始$allPosts
数据检索到Vue中
mounted () {
axios.get(this.page)
.then(response => ([
this.list = response.data.data,
this.page = response.data.next_page_url
]))
},
下面是当用户单击“加载更多”按钮时调用的方法的一个片段
因为响应是一个对象,所以使用this.list.push()
无效并引发错误,因为this.list
应该是一个数组
此外,下面是我的Vue数据对象的一个片段
data: {
page: "{{route('api-news')}}",
list: [
],
paginatedList: [
],
},
我的列表对象的图像(其中列表应改为数组):
如何强制
$allPosts
以数组形式返回 我会尝试在paginate()
之前而不是之后添加对values()
的调用
$allPosts = $allPosts->sortByDesc('created_at')->values()->paginate(15);
return response()->json($allPosts);
Vue通过查看键来确定是否将数组视为数组或对象:如果键是数字的、零索引的和顺序的,则将其视为数组,否则将其视为对象
在您的情况下,sortByDesc()
collection方法会维护原始密钥,以便Vue看到非顺序密钥并将其作为对象处理。通过values()
运行已排序的集合,您应该可以获得一个正确索引的集合,以传递给Vue
更新:
根据您的评论,上面的解决方案仅适用于结果的第一页,而不适用于其他页面,我怀疑paginate()
方法也在维护原始键。因此,第一个区块的键从0开始,而第二个区块的键从15开始。您可能需要覆盖该值,以便将每个块重新索引为0
在将结果推送到模型中之前,也可以在Vue代码中执行此操作。类似于
response.data.list.filter(item=>item)
的东西可能会起作用。遇到这个问题时,正如@Graeme所说,它在第一页起作用,但在第二页不起作用。最后,我手动覆盖了lengshawarepaginator
中的项,并重置了数组索引
$collect = $Products->get()->values();
$ProductsPaginated = ProductResource::collection($collect)->paginate(12);
$items = $ProductsPaginated->items();
$decodeFix = json_decode($ProductsPaginated->toJson());
$decodeFix->data = array_values($items);
return json_encode($decodeFix);
你能分享一段
列表
内容吗?试试$allPosts->toArray()
@adam我已经试过了,没什么区别。@BoussadjraBrahim已经编辑了文章以附加图像。正如您所看到的,列表是一个对象,但它需要是一个数组。不过需要注意的是,list
中的项目可以作为对象,但是list
本身需要是一个数组。list是一个对象,因为您有一个list
键。将列表
作为键删除,您将拥有一个基于0的索引数组。这几乎解决了问题。第一页很好,数据
作为数组返回,但是第二页数据
仍然作为对象返回。您是否对集合的paginate()
方法使用宏或其他内容?你能发那个密码吗?
$collect = $Products->get()->values();
$ProductsPaginated = ProductResource::collection($collect)->paginate(12);
$items = $ProductsPaginated->items();
$decodeFix = json_decode($ProductsPaginated->toJson());
$decodeFix->data = array_values($items);
return json_encode($decodeFix);