专家
我一直在我的项目中使用这个模型。但是,现在由于方法的重复查询而面临性能噪音,当然需要在相关对象上制作和内联接Where子句以及我怎么能做到是什么?
我有Profile
,Media
,Product
表相关。
当我想获得所有带有个人资料,媒体和细节的产品时,我会在代码下方使用。而且,除了with之外,它的工作会创建重复的选择语句。
$all_products = $this->with('medias')->with('profile')->get_all();
现在,我希望所有产品的个人资料都经过验证。
select * from products
inner join profile as p on p.id = product.profile_id
inner join media as m on m.product_id=p.product_id
where profile.is_verfied='true';
我怎样才能使用我的MY_MODEL方式或稍作修改。
答案 0 :(得分:3)
我也使用@Jamie Rumbelow的基本模型,几乎没有修改(一两个)。当谈到加入时,它有一个很棒的触发方法,你可以使用:before_get
观察者。在您的情况下,只需添加一个观察者,您可以从所需的表中加入,如下所示:
在模型构造函数中:
public function __constrcutor()
{
array_unshift(
$this->before_get,
'join_from_profile_and_media'
);
// Then
parent::__construct();
}
观察者将是:
protected function join_from_profile_and_media()
{
$this->db->join('profile', 'profile.id = product.profile_id');
$this->db->join('media', 'media.product_id = profile.product_id');
}
现在,只要您拨打get()
,get_many()
,get_by()
或get_many_by()
,所有表格都是联合的。
答案 1 :(得分:1)
如果您遇到性能问题,请不要使用with()
!它是管理关系的粗略方式,仅用于原型设计或简单关系。
我建议手动进行联接:
$products = $this->select('products.*')
->join('profile', 'p.id = products.profile_id', 'inner')
->where('profile.is_verified', true)
->get_all();
答案 2 :(得分:-1)