2014-10-28 65 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