MY_Model jamierumbelow

时间:2015-05-19 08:34:00

标签: php mysql codeigniter my-model-jami

专家

我一直在我的项目中使用这个模型。但是,现在由于方法的重复查询而面临性能噪音,当然需要在相关对象上制作和内联接Where子句以及我怎么能做到是什么?

我有ProfileMediaProduct表相关。 当我想获得所有带有个人资料,媒体和细节的产品时,我会在代码下方使用。而且,除了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方式或稍作修改。

3 个答案:

答案 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)

Danielad,

有许多可用的缓存技术。在我的项目中,我们也使用RedisMemcached。还使用Javascripts,CSS,Images等客户端(网站)端缓存。

Redis / Memcached是非常强大的工具。 Facebook正在使用Memcached实现非常快的输出和低负载的数据库服务器。

希望这会有所帮助!!