querybuilder上的reverse()get()更改了集合结果

时间:2018-05-03 10:13:25

标签: laravel collections reverse laravel-query-builder

我需要获取由数据排序的表的最后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" ...

正如您所看到的,该集合已更改,我不知道原因。

3 个答案:

答案 0 :(得分:3)

使用此键重置键:

->reverse()->values();

答案 1 :(得分:1)

执行此操作时:

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

你得到一个包含这些值的Collection对象。底层数组中值的将是数字,即0, 1, 2, ... 9。现在你正在做的事情:

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

您将以相反的顺序返回相同的集合。 reverse方法会创建 new 集合,但会保留原始集合的键。因此,在这种情况下,您将看到最后一项,首先是密钥,9, 8, 7, ... 0。在PHP中,如果数组键不是整数,则从0开始按升序排列,它被假定为关联数组。因此,当您将集合作为JSON输出时,您会将其视为对象。

忽略集合中密钥的一种方法是使用values,以便创建 new 集合(使用递增的数字键,即0, 1, 2, ... 9),初始集合的值:

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

答案 2 :(得分:0)

如laravel的集合文档中所述,当您将reverse方法应用于集合时,集合顺序将会更改。

在这种情况下,您可以按data_oradesc获取数据收集顺序,

当您在获取后应用reverse时,这意味着您将撤消要由data_ora排序的集合,但ASC不是DESC

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

在此处查看laravel文档reverse method