2014-09-24 60 views
0

我有2個表:返回雄辯的關係自定義格式

Services 
id | name | ... 

Prices 
id | service_id | day | time | price 

一個服務可以有許多的價格(按天在一週時間內天)。

當我試圖讓我的對象,並把它變成數組,這是現在的樣子:

$service = Service::with('prices')->find(1); 

array 
    'id' => string '1' 
    'name' => string 'Test' 
    'prices' => 
    array 
     0 => 
     array (size=7) 
      'id' => string '1' 
      'service_id' => string '1' 
      'day' => string '1' 
      'time' => string '0' 
      'price' => string '50.00' 
     1 => 
     array (size=7) 
      'id' => string '2' 
      'service_id' => string '1' 
      'day' => string '1' 
      'time' => string '1' 
      'price' => string '50.00' 
     ... 

我想獲得這個服務對象看起來像這樣:

array 
    'id' => string '1' 
    'name' => string 'Test' 
    'prices' => 
    array 
     1 => array 
      '0' => '100.00' 
      '1' => '100.00' 
      ... 
      '23' => '450.00' 
     2 => array 
      '0' => '100.00' 
      '1' => '100.00' 
      ... 
      '23' => '450.00' 

在換句話說,我希望我的關係返回包含天(1-7)的第一個數組,並且每天都是在那一天與時間(0-23)數組。

這樣做的最佳做法是什麼?

回答

1

我會有一個單獨的幫助類,做數據修改。假設你的價格模式被稱爲價格:

class ModelFormatter { 

private $pc; 

public function __construct(Collection $pricesCollection){ 
    $this->pc = $pricesCollection; 
} 

public function toArray(){ 
    $result = []; 

    foreach($this->pc as $item){ 
     //do checks and build up the $result array 
    } 

    return $result; 
} 

} 

然後

$service = Service::with('prices')->find(1); 
$prices = $service->prices; 

(new ModelFormatter($prices))->toArray();

+0

豈不是更好地利用這一任務數據庫?使用查詢範圍之類的東西..通過這種方式,我的控制器將更乾淨,所有工作都將在db上。 – 2014-09-24 13:04:09

+0

查詢範圍用於指定...以及查詢的範圍。你想要做的是與另一種格式建立關係。所以另一種選擇是創建一個單獨的關係'pricesToArray',並以某種方式修改關係,以便以這種格式返回數據。修改關係的一個例子可以在這裏看到:http://stackoverflow.com/questions/24343738/getting-just-the-latest-value-on-a-joined-table-with-eloquent#24350807 – 2014-09-24 13:13:29

+0

有沒有將這種新格式存儲回原始對象$ service的方法。 Like $ service-> prices =(new ModelFormatter($ service-> prices)) - > toArray(); 當我試圖將該對象傳遞給javascript或var_dump時,我發現價格屬性與數據庫是原始關係 – 2014-09-25 12:30:25