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

Gia*_*o M 2 collections reverse laravel laravel-query-builder

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

这是相反的代码:

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

如果我记录结果,我将得到:

[{"id":12297,"stato_batteria":null,"data_ora":"2018-05-03 11:40:02" ...
Run Code Online (Sandbox Code Playgroud)

反向代码为:

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

如果我记录结果,我将得到:

{"9":{"id":1410,"stato_batteria":null,"data_ora":"2018-04-05 14:16:48" ...
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eir 7

使用此重置密钥:

->reverse()->values();
Run Code Online (Sandbox Code Playgroud)


Jon*_*hon 6

当你这样做时:

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

您会得到一个Collection包含这些值的对象。底层数组中值的键将是数字,0, 1, 2, ... 9。现在当你做的时候:

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

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

忽略集合中键的一种方法是使用values,以便创建一个0, 1, 2, ... 9集合(使用升序数字键,即),仅使用初始集合的值:

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