Laravel |возвращение groupBy как объекта - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь использовать коллекцию Laravel для возврата groupBy в качестве массива.Тем не менее, он, кажется, всегда возвращается как объект, несмотря ни на что.Я пытался сделать $posts->groupBy('category')->toArray(), но, похоже, все еще возвращается как объект.Я также попытался $posts->groupBy('category')->all(), и все же он возвращается как объект.

Я не знаю, связано ли это с методами возврата Laravel в маршрутах, но мне нужно, чтобы это возвращалось как массив.

Вот код:

public function getFeatures($id)
{
    return Feature::query()->get()->groupBy('category')->toArray();
}

Фактический код работает нормально, и я получаю результаты, но кажется, что он не конвертируется в массив.Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Прочитав ваш комментарий к другому ответу, я понял, что вы имеете в виду.

Привет @HCK, спасибо за ответ.* * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * *1009* * * * * * * * * * * * * * * * Во-первых, этот ответ основан на предположении, что вы делаетечто-то вроде этого на вашем контроллере (вы не опубликовали код контроллера):

return reponse()->json($theResponseFromGetFeaturesMethod);

Поскольку внутри php переменная $theResponseFromGetFeaturesMethod содержит словарный массив (что-то вроде ["key"=>"value]), когда вы конвертируете егов JSON вы заметите, что происходит такое «преобразование».

Это происходит потому, что массивы Javascript (и JSON) не поддерживают словарные массивы.Посмотрите этот пример на консоли javascript:

> var a = [];
  undefined
> a['key'] = "value"
  "value"
> a
  > key: "value"
    length: 0
    __proto__: Array(0)

Обратите внимание, что a по-прежнему имеет нулевую длину, но теперь у него есть свойство key.

Это происходит потому, что почти всена JavaScript это на самом деле объект.Таким образом, массив - это особый тип объекта, который имеет push, pop и многие другие методы массива.Выполнение array[] = 'somevalue' на самом деле является ярлыком для array.push('somevalue').

Итак, поведение, которое вы наблюдаете, правильное, метод toArray() работает, как и ожидалось, и преобразование JSON тоже.


Другое странное поведение при попытке преобразовать этот массив PHP в JSON:

[
     0 => 'a'
     1 => 'b'
     9 => 'c'
]

Вы заметите, что в этом случае PHP преобразует этот массив в объекттоже.Результат в JSON будет таким:

{
    "0": "a",
    "1": "b",
    "2": "c"
}

Это также ожидаемое поведение, поскольку синтаксис JSON не поддерживает определение индекса для значения.

0 голосов
/ 24 ноября 2018

При выполнении запроса для получения (возможно) нескольких элементов с использованием Eloquent, Laravel всегда будет возвращать экземпляр класса Collection , который содержит все объекты модели.Если вам нужно преобразовать их в массив, чтобы использовать их в представлении, вы можете compact элементы.compact создаст ассоциативный массив элементов коллекции:

public function getFeatures($id)
{
    $features = Feature::all();

    return view('my_cool_view', compact($features));
}

С другой стороны, если вам необходимо преобразовать их в массив для возврата через API, Laravel преобразует ответ в JSON с помощьюпо умолчанию:

public function getFeatures($id)
{
    return Feature::all();
}

Теперь, если вам нужно каким-то образом преобразовать коллекцию в массив, просто используйте toArray(), как вы указали:

public function getFeatures($id)
{
    $collection_of_features = Feature::all();

    $array_of_features = $collection_of_features->toArray();

    // use it for wherever you want.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...