数组使用资源作为对象返回

Posted

技术标签:

【中文标题】数组使用资源作为对象返回【英文标题】:Array is returned as an object using resource 【发布时间】:2020-08-10 21:52:12 【问题描述】:

发生了一些奇怪的事情。

我有一个这样的数组:

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

这个数组被一个资源使用,如果我使用 tinker 来检查这个资源,像这样:

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

is_array($result->optionalinformation);

在这种情况下,结果是true:这是一个数组。

但是如果 axios 获取结果,我会得到这个:

"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,
        ];
    

【问题讨论】:

你期待什么样的结果? 好吧:我希望有一个数组。 请贴出js的例子。 【参考方案1】:

它在定义中。 Laravel's resource classes allow you to expressively and easily transform your models and model collections into JSON.查看Resource docs

如果您期望返回一个数组,那么我建议您跳过资源并使用->toArray() 直接从控制器传递数据。但是你又在你的 vuejs 中使用了axios,那么我强烈建议你坚持使用json 格式作为预期的响应。

【讨论】:

【参考方案2】:

这里有点混乱,主要是由 php 术语引起的。

在 PHP 术语中,关联数组仍然是一个数组。但是关联数组实际上是一个字典。

其他编程语言不会将关联数组(字典)视为数组,因此具有不同的词汇表。

您的数据结构实际上是一个字典,而不是数字索引数组。

从 JSON 的角度来看,如果您的数据结构具有非数字键,那么它会被转换为对象。

您的困惑源于这样一个事实:is_array 如果变量是从零开始的索引数组,则返回 true,而事实上它对于关联数组也返回 true。

【讨论】:

以上是关于数组使用资源作为对象返回的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中将数组作为 API 资源返回

使用 Restangular 使用 RESTful api - RESTful api 将数组作为***对象返回是不是安全?

如何处理 API 有时将属性作为数组返回,有时作为对象返回?

PHP json_encode将行作为对象而不是数组返回[重复]

输入对象数组作为输入并返回一个数组作为存储过程的输出

为啥 Vuex 状态将数组作为对象返回