2014-09-05 111 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