У меня есть этот код

            $list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
{
            return $t->visitors->count();
        });
        return json_encode($list);

Этот код возвращает объект, а не массив. Как я могу это изменить?

1
helloRoman5556 19 Дек 2019 в 01:36

3 ответа

Вы должны добавить ->values(), если вы хотите получить фактический массив JSON в конце.

Поскольку вы могли бы добавить другие манипуляции, такие как фильтры и преобразования, я бы вызвал ->values() в самый последний момент:

return json_encode($list->values());

Причина использования ->values() поверх других опций заключается в том, что он сбрасывает ключи массива. Если вы попытаетесь вернуть некоторый ассоциативный массив (например, ['name' => 'Roman'] или даже [1 => 'item', 0 => 'other']), он всегда будет закодирован как объект. Вам нужно иметь простой массив (с последовательными целочисленными ключами, начинающимися с 0), чтобы избежать непредвиденных ситуаций, которые будут делать фильтрация и сортировка.

1
Džuris 18 Дек 2019 в 23:50
$list = Elements::where('list_id', $id)->with('visitors')->get();;

Этот код возвращает коллекционный экземпляр. $collection->sortBy(...); также является экземпляром Collection. Для получения массива в Collection вы должны использовать либо ->toArray(), либо ->all()

В вашем случае вы можете использовать

$list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t) {
    return $t->visitors->count();
})->all();
0
Davit 18 Дек 2019 в 22:54

Вам просто нужно вызвать метод ->all() Collection, поэтому

$list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
      {
             return $t->visitors->count();
      }
)->all();

это отличается от метода ->toArray(), потому что он также приводит к массиву также объект внутри коллекции, и не только саму коллекцию (фактически ->all() ничего не будет приводить, он просто вернет элементы внутри Коллекция)

1
AlbertoSinigaglia 18 Дек 2019 в 22:40