将关联数组做成类似于 Eloquent 查询集合的集合

Posted

技术标签:

【中文标题】将关联数组做成类似于 Eloquent 查询集合的集合【英文标题】:Make associative array into a collection similar to Eloquent query collection 【发布时间】:2018-02-23 14:20:08 【问题描述】:

我有一个接收 API 数据的类,我想将所有响应包装到一个集合类中。因此,我从 API 调用接收数据,将其转换为普通的关联 php 数组,并使用 collect() 帮助器将其包装。

我有一半期望它像 Eloquent 一样工作,您可以将键引用为集合属性,但事实并非如此。

这是我将收到的响应数据示例:

$data = [
    'status' => 'SUCCESS',
    'message' => 'Your request was received.',
    'data' => [
        'first_name' => 'John',
        'last_name' => 'Doe',
        'address' => [
            'street' => '123 Main St.',
            'city' => 'Any City',
            'state' => 'TX',
            'zip' => '12345',
            'country' => 'USA'
        ],
        'email' => 'john@doe.com',
        'phone' => '(123) 456-7890',
        'role' => 'Administrator',
        'active_orders' => 3
    ]
];

$response = collect($data);

我希望能够将这些数据包装在一个集合中并像这样使用它:

$response->data->address->street$response->data->first_name

但是,我收到一条错误消息,上面写着 Property [data] does not exist on this collection instance. 如果我想访问它,我必须像数组一样引用它。例如。 $response['data']['first_name']。如果我想使用该语法,我会将其保留为数组。

如何递归地将我的集合属性设置为数组键名,以便我可以像使用 Eloquent 查询一样使用它?

【问题讨论】:

您是如何收到此回复的?如果由于 HTTP 请求而json_decodeing 它,则可以让json_decode 返回StdClass 对象表示而不是数组。这样您就可以按照自己的意愿引用提供的数据。 【参考方案1】:

如何递归地将我的集合属性设置为数组键名,以便我可以像使用 Eloquent 查询一样使用它?

json_decode() 通常会解构为这样的对象。但是您需要从 JSON 开始。所以,这看起来很傻,而且可能效率不高,但这应该可以满足您的需求:

$response = json_decode(json_encode($data));

【讨论】:

这是一种将数组转换为对象的有效方法,但我想专门利用 Laravel 的集合类方法。 我认为你在混合CollectionsModels 你不能使用->property 而不在@Mark 之前使用->first()

以上是关于将关联数组做成类似于 Eloquent 查询集合的集合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 从原始数据库(或只是一个数组)创建集合或关联数组

在刀片中显示 laravel DB::select 数组

Laravel:将 Eloquent 集合转换为数组而不转换元素

Laravel5.6 Eloquent ORM 关联关系,一对一和一对多

Laravel Eloquent 多对多查询 whereIn

Laravel 5 Eloquent - 将计算值作为列添加到集合