2014-10-28 64 views
0

正在使用自定義php應用程序中的糖數據庫結構。laravel illuminate - 將延遲加載函數附加到模型屬性

例如你編寫一個查詢像這樣

 SELECT * 
     FROM quotes 
INNER JOIN quotes_cstm on quotes.id = quotes_cstm.id_c AND quotes.deleted = 0 
# some wheres here 

從laravel繼承人我的代碼
的一個實例。

class quotes_cstmModel extends baseModel 
{ 


} 


class quotesModel extends baseModel 
{ 
    public static $select = ['id', 'name']; 

    protected $with = ['quotes_cstm']; 

    public function quotes_cstm() 
    { 
     return $this->hasOne('quotes_cstmModel','id_c'); 
    } 
} 

報價模型的指定者輸出是一樣的東西

array(
id => '231312', 
name => 'quote name', 
quotes_cstm = array(
    'id_c' => '231312' 
    'some_cstm_field_c' => 'some value', 
) 
); 

所以我問什麼,我怎麼只追加id_c和some_cstm_field_c到主陣列,而不多維的quotes_cstm部分陣列?

使用的例子,我想是這樣

我試着去我的使用保持到這樣的事情。

$quote = quotesModel::find('QUOTE_ID_HERE');

+0

你可以使用[扁平化陣列功能](http://laravel.com/docs/4.2/helpers#arrays),但是這會刪除數組中的所有鍵。只有值纔會被留下。 – Jerodev 2014-10-28 15:54:10

+0

雖然我會失去laravels集合功能。 – 2014-10-28 15:56:18

回答

1

您可以覆蓋__get方法,以試圖訪問的關係的性質,如果它不是在報價單中發現:

class quotesModel extends baseModel 
{ 
    public function __get($key) 
    { 
     return $this->getAttribute($key) ?: $this->quotes_cstm->getAttribute($key); 
    } 
}  
+0

我仍然懶散laravels收集東西..我想我可能不得不保留quotes_cstm子陣列。我希望避免這種情況。 謝謝你 – 2014-10-28 19:07:21

+0

你是什麼意思的'鬆散laravels收集東西'?在它上運行toArray將其轉換爲多維數組,因此無論如何您都無法在該點之後運行任何收集方法。如果你能夠展示一個你使用對象的地方的例子,那將是有幫助的 - 因爲我想你可以使用代理方法或魔術__get()和__set()方法來實現你的目標。謝謝。 – Peter 2014-10-30 09:18:59

+0

如果我使用類似 '$報價= quotesModel ::找到( 'QUOTE_ID_HERE');' *目前,從加入我必須 使用自定義值'$ id_c = $ quotes-> quotes_cstm-> id_c;' >我想要 '$ id_c = $ quotes-> id_c;' – 2014-10-30 14:46:34