2017-09-14 58 views
0

我有一个接收API数据的类,我想将所有响应包装到集合类中。所以,我从API调用接收数据,将它变成一个普通的关联php数组,然后使用帮助器将其包装起来。将关联数组转换为类似于Eloquent查询集合的集合

我只是期待它的工作就像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' => '[email protected]', 
     '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查询那样使用它了?

+0

你是如何得到这个回应的?如果你是'json_decode'作为HTTP请求的结果,你可以改为'json_decode'返回一个'StdClass'对象表示而不是数组。这将允许您参考您打算提供的数据。 –

回答

1

如何递归设置我的集合属性作为数组键名,这样我就可以像使用Eloquent查询那样使用它了?

json_decode()通常解构成这样的对象。但是你需要从JSON开始。所以,这似乎很愚蠢,而且可能效率不高,但这应该是你想要的:

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

这是一种将数组转换为对象的有效方法,但我想特别利用Laravel的集合类方法。 – Mark

+0

我认为你是mixin Collections和Models你不能在不使用' - > first()'前使用' - > property' @ @Mark – aaron0207