Php 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查询合并在一

我有一个由Vue和Vue同位素加载的新闻页面。Vue同位素要求我的数据是一个数组,这样当用户单击“加载更多”按钮时,我可以向同位素添加更多文章。其工作方式是,当用户单击“加载更多”时,使用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);

}
我能得到的最接近的方法是在
$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);