2014-09-05 78 views
4

是否有一种优雅的方式从一个雄辩对象中删除NULL值?我的对象与关系嵌套。这个特定的呼叫长度可能是1000行,所以我尝试这样做的主要原因是为用户节省带宽,但服务器性能也是一个考虑因素。Laravel,从JSON中删除null雄辩的对象属性

我的代码:

$data['locations'] = Location::with('address')->where('user_id', '1')->get(); 

return Response::json($data); 

我尝试过改变者,但除非我错了存取器没有权力的对象键,就值。

我也尝试和失败使用array_filter这样的:

Any PHP function that will strip properties of an object that are null?

How to remove empty associative array entries

编辑根据要求,

{ 
    "status": "ok", 
    "locations": [ 
     { 
      "id": "1", 
      "latitude": "12.239107980271", 
      "longitude": "109.19479025725", 
      "user_time": "", 
      "transport": "Bus", 
      "title1": "", 
      "title2": "", 
      "address": { 
       "town": "Nha Trang", 
       "country": "Vietnam", 
       "address": "36-44 Hùng Vương, Lộc Thọ, Nha Trang, Khanh Hoa Province, Vietnam" 
      }, 
      "altitude": { 
       "altitude": "10.006237983704" 
      }, 
      "timezone": { 
       "offset": "25200" 
      }, 
      "forecast": { 
       "icon": "", 
       "high_temp": "", 
       "low_temp": "" 
      } 
     }, 
     { 
      "id": "2", 

所需的响应:

{ 
    "status": "ok", 
    "locations": [ 
     { 
      "id": "1", 
      "latitude": "12.239107980271", 
      "longitude": "109.19479025725", 
      "transport": "Bus", 
      "address": { 
       "town": "Nha Trang", 
       "country": "Vietnam", 
       "address": "36-44 Hùng Vương, Lộc Thọ, Nha Trang, Khanh Hoa Province, Vietnam" 
      }, 
      "altitude": { 
       "altitude": "10.006237983704" 
      }, 
      "timezone": { 
       "offset": "25200" 
      } 
     }, 
     { 
      "id": "2", 

正如您所看到的,我可以简单地遍历整个过程并删除任何键 - 或键的键 - 没有值。我希望拉拉维尔能提供一个干净/快速的方式来做同样的事情。

我应该补充说,技术上只有经纬度是必填字段!

+0

发表一个你得到的和你想要的结果的例子。 – marcanuy 2014-09-05 18:02:46

+0

已发布样本! – daviestar 2014-09-05 20:20:05

回答

3

3种可能性:

  1. 响应宏观这样做可以清理你的JSON数据: http://laravel.com/docs/responses#response-macros
  2. 扩展Response类,并有实现你的清理程序。详情请参阅如何做到这一点这个伟大的教程:http://fideloper.com/extend-request-response-laravel
  3. 落实jsonSerialize方法在模型中,将在您的模型转换成JSON,把你清理程序也被自动调用。您甚至可以更进一步,为您的Location型号编写自己的Collection。根据您的数据结构,这可以使事情变得更容易一些。一个很好的教程,为此可以在这里找到:http://heera.it/extend-laravel-eloquent-collection-object

我个人宁愿选项3),因为该数据的修改发生在它应该出现 - 在你的模型。

但底线确实取决于哪种解决方案最适合您的项目。

+1

谢谢,那些文章很有趣。核心功能的这种重写/扩展让我觉得这是一个相当严峻的解决方案,可能会影响升级路径。我将在稍后报告。 – daviestar 2014-09-05 20:14:25

+0

不要害怕,拉拉维尔是这样做的:http://laravel.com/docs/extending和http://laravel.com/docs/ioc。我的建议没有一个是“肮脏的黑客”,一切都完全遵循召集。 – passioncoder 2014-09-05 20:21:38

+3

所有这些建议都可以使用。然而,还有另外一种方法,与** opt 3 **相反,因为model不是这个地方(这不是数据修改,而是表示层)。使用api变压器并保持固态。例如。 http://fractal.thephpleague.com/transformers/和https://github.com/dingo/api – 2014-09-06 08:02:02