reverse () в построителе запросов get () изменяет результаты коллекции - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно получить последние 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 голосов
/ 03 мая 2018

Используйте это для сброса ключей:

->reverse()->values();
0 голосов
/ 03 мая 2018

Когда вы делаете это:

$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 создает новую коллекцию , но сохраняет ключи исходной коллекции. Таким образом, в этом случае вы увидите последний элемент, первый, и ключи будут 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();
0 голосов
/ 03 мая 2018

, как упомянуто в документации коллекции laravel, когда вы применяете метод reverse к коллекции, порядок сбора изменится.

в этом случае вы получаете порядок сбора данных по data_ora и desc,

когда вы применяете reverse после получения, это означает, что вы перевернете коллекцию для упорядочения по data_ora, но ASC не DESC.

другими словами, первый элемент коллекции будет последним ...

см. Документацию по Laravel здесь обратный метод

...