reverse() on querybuilder get() 改变收集结果

reverse() on querybuilder get() changes the collection results

我需要获取按数据排序的 table 的最后 10 条记录,并将它们反转。

这是反转前的代码:

$eventi = \App\Model::with('relation_1', 'relation_2')
    ->orderBy('data_ora', 'desc')
    ->take(10)
    ->get();

如果我记录结果,我会得到这个:

[{"id":12297,"stato_batteria":null,"data_ora":"2018-05-03 11:40:02" ...

反码为:

$eventi = \App\Model::with('relation_1', 'relation_2')
    ->orderBy('data_ora', 'desc')
    ->take(10)
    ->get()
    ->reverse();

如果我记录结果,我会得到这个:

{"9":{"id":1410,"stato_batteria":null,"data_ora":"2018-04-05 14:16:48" ...

如您所见,集合已更改,我不知道为什么。

如 laravel 的集合文档中所述,当您将 reverse 方法应用于集合时,集合顺序将发生变化。

在您的情况下,您通过 data_oradesc

获得数据收集顺序

当你在 get 之后应用 reverse 时,这意味着你将反转要按 data_oraASC 而不是 DESC.

排序的集合

换句话说,集合的第一个元素将是最后一个...

在此处查看 laravel 文档 reverse method

使用此重置键:

->reverse()->values();

当你这样做时:

$eventi = \App\Model::with('relation_1', 'relation_2')
    ->orderBy('data_ora', 'desc')
    ->take(10)
    ->get();

您会得到一个 Collection object,其中包含这些值。基础数组中值的 keys 将是数字,即 0, 1, 2, ... 9。现在当你在做的时候:

$eventi = \App\Model::with('relation_1', 'relation_2')
    ->orderBy('data_ora', 'desc')
    ->take(10)
    ->get()
    ->reverse();

您将得到相同的 collection,但顺序相反。 reverse 方法创建了一个 new collection,但保留了原始 collection 的键。所以在这种情况下,您将首先看到最后一项,并且键将是 9, 8, 7, ... 0。在 PHP 中,如果您的数组键不是整数,则从 0 开始按升序排列,它被假定为关联数组。因此,当您将 collection 输出为 JSON 时,您会看到它表示为 object.

忽略 collection 中的键的一种方法是使用 values,这样就会创建一个 new collection(用升序数字键,即 0, 1, 2, ... 9),仅具有初始值 collection:

$eventi = \App\Model::with('relation_1', 'relation_2')
    ->orderBy('data_ora', 'desc')
    ->take(10)
    ->get()
    ->reverse()
    ->values();