Массив возвращается как объект с использованием ресурса - PullRequest
0 голосов
/ 27 апреля 2020

происходит что-то странное.

Я получил такой массив:

=> [
     "optionalinformation" => [
       "domain" => [
         "type" => "string",
       ],
     ],
   ]

Этот массив используется ресурсом, и если я использую tinker для проверки этого ресурса, вот так:

$result = App\Http\Resources\ProductResource::make(Product::find(2));

is_array($result->optionalinformation);

В этом случае результат true: это массив.

Но если ax ios получает результат, я получаю это:

"optionalinformation": {
      "domain": {
        "type": "string"
      },

Это уже не массив, а объект. Есть идеи, почему это происходит?

Это мой API-ресурс:

 /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'                      => $this->id,
            'title'                   => $this->title,
            'optionalinformation'     => $this->optionalinformation,
        ];
    }

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Здесь есть некоторая путаница, в основном вызванная PHP lin go.

В PHP lin go ассоциативный массив все еще является массивом. Но ассоциативный массив - это на самом деле словарь.

Другие языки программирования не видят ассоциативный массив (словарь) в виде массива и поэтому имеют другой словарь.

Ваша структура данных фактически словарь, а не числовой индексированный массив.

С точки зрения JSON, если ваша структура данных имеет нечисловые ключи, она преобразуется в объект.

Ваша путаница проистекает из того факта, что is_array вернет истину, если переменная является индексированным массивом, основанным на нуле, а на самом деле она возвращает истину и для ассоциированных массивов.

0 голосов
/ 27 апреля 2020

Это в определении. Laravel's resource classes allow you to expressively and easily transform your models and model collections into JSON. Проверьте Документацию по ресурсам

Если вы ожидаете возврат массива, я предлагаю пропустить ресурс и передать данные непосредственно из контроллера, используя ->toArray(). Но опять же, вы используете axios в своем vuejs, тогда я настоятельно рекомендую придерживаться формата json в качестве ожидаемого ответа.

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