笨活动记录与定期查询(CodeIgniter Active Record vs. regular q

2019-08-08 06:30发布

目前我使用笨定期查询,即:

$sql = "
    SELECT *
    FROM my_table
    WHERE item_id > 1
";    
$q = $this->db->query($sql);

我已经开始寻找到的ActiveRecord,并且它看起来美观大方,并具有无论哪个数据库驱动程序使用的正在修建的查询的优势 - 但是,我严格地使用每个在一般项目一个单一的数据库类型,所以这不是一个真正的受益于我。

我发现,经常查询(正如我在我的例子)更容易阅读和维护在我看来,所以我目前想定期查询保持的。

除了上面提到的原因,这是我应该选择,出于什么原因(S)?

谢谢

Answer 1:

很适合我,我更喜欢运行的常规查询,CI的活动记录要消耗多少内存。 因为它会加载所有结果在存储器中。 如果你明白我的意思。 至于复杂性,最好去定期查询而坚持CI的活动记录的语法时才。



Answer 2:

我倾向于选择ActiveRecord的大部分。 我觉得它更具可读性,它使得构建动态查询,你不必猴子周围的原始SQL的明确串联在一起的块太大容易得多。 这意味着我可以添加各种条件句我查询建设者很少做文章,用的东西,很容易读出来。

有一些事情为其笨实现的ActiveRecord的是很差适合(和让我怀念学说),我直接使用SQL为,但它不会经常发生。



Answer 3:

那么对于你在哪里写SELECT等等等等,你可以改变你的风格使用的Active Record一点,因为在写常规查询有很多机会,你可能会做出错误了Syntex的tireds简单quesries。 活动记录的目的是为了这个目的,你不需要写usuall语法,其中,除非你是一个专家犯错误的几率就很高。 同时活动记录给出逃逸设施。 你不熟悉的活动记录它们(简单时),可读了。 看看这个例子

$array  =   array(
        'user.username',
        'user.email',
        'user.password',
        'other.blah',
        'other.blah'
);
$where  =   array(
        'active'    =>  1,
        'other'     =>  'blahblah'
);  

return $this->db
        ->select($array)
        ->from('user')
        ->join('other','other.user_id = user.id','left')
        ->where($where)
        ->get()
        ->result();    


Answer 4:

近两年后,我发现这个问题。 我的一些colleages的已经有几个优点或缺点回答,我只是想通过我的亲身经历,以添加意见:

正如有人说,我也混合使用活动记录一些时间和纯直SQL非常复杂的查询,其原因就在于它是非常简单的,当你需要收到大量的操作系统参数,并相应地改变了查询的方法来使用它。 例如,我具有接收的所谓的“选项”的参数的阵列的方法:

if(!empty($options['login']))
{
    $this->db->where('tl.login', $options['login']);
}
if(!empty($options['ip']))
{
    $this->db->where('tl.ip', $options['ip']);
}
if(!empty($options['sucesso']))
{
    $this->db->where('tl.sucesso', $options['sucesso']);
}

if(isset($options['usuarios_existentes']) && $options['usuarios_existentes'])
{
    $this->db->join('usuario u', 'tl.login = u.login');
}
else
{
    $this->db->join('usuario u', 'tl.login = u.login', 'LEFT');
}

if(!empty($options['limit']))
{
    $this->db->limit($options['limit']);
}
else
{
    $this->db->limit(50);
}

return $this->db->select('tl.id_tentativa_login, tl.login, DATE_FORMAT(tl.data, "%d/%m/%Y %H:%i:%s") as data, tl.ip, tl.sucesso', FALSE)
                ->from('logs.tentativa_login tl')
                ->order_by('tl.data', 'DESC')
                ->get()->result();

当然,这只是一个简单的例子,但我已经建造方法与数百行和条件可能会改变一个通用的“得到”方法,和活动记录使得它非常好的,非常可读的,因为你不需要写代码的中间它正确格式化查询。

你甚至可以连接和其他的东西,可以是有条件的,所以你可以使用一个通用的集中式方法,这种方式避免重写大部分代码,复制它的部分(可怕的维持性),它不仅是可读的,但它一直你的查询快,因为只加载你所需要的:

if(!empty($opcoes['com_maquina']))
{
    if(strtoupper($opcoes['com_maquina'])=='SIM')
    {
        $this->db->join('maquina m', 'm.id_local = l.id_local');
    }
    elseif(strtoupper($opcoes['com_maquina'])=='NAO')
    {
        $this->db->join('maquina m', 'm.id_local = l.id_local', 'LEFT');
        $this->db->where('m.id_maquina IS NULL');
    }
}

换个好点的ActiveRecord的是,它接受文中陈述纯SQL,像子查询和其他的东西,所以你可以使用它作为你请。

我在谈论的优点,但是,很明显,纯SQL总是会更快地执行,不会有调用函数的开销。 但说实话,在大多数情况下PHP解析器会做如此之快,它不会影响最终结果在表达方式,如果你必须做出大量的手工条件下,你的代码也许是因为ActiveRecord的慢解析器反正。

要知道,有时候ActiveRecord的查询不会工作,你所期望的方式,因为它试图建立在它被编程做一个合乎逻辑的方式查询,因此用“OR”例如报表时要小心,你必须这样做,最次隔离它(和):

$this->db->where('(m.ultimo_status < DATE_ADD(NOW(), INTERVAL -2 HOUR) OR m.ultimo_status IS NULL)');

如果斑点不添加()时,OR statament将影响整个where子句。 所以,一旦你习惯了ActiveRecord的,它可以帮助很多,仍然做出快速和可读性查询。



Answer 5:

好了,我的主要的原因是,它快速和安全。 由于自动转义值等等。但是,当涉及到复杂的查询的话,建议用一个正常的查询字符串。

(不谈论加入等等。因为笨支持它相当不错,可读性)更多类似支点查询的,或选择由ROWNUMBER(如下面)

$query = $this->db->query('SELECT * FROM
  (SELECT  @row := @row + 1 as row, t.*
   FROM `default_red_albums` t, (SELECT @row := 0) r) AS view
WHERE `row` IN(' . $in . ')');

return $query->result();


Answer 6:

ActiveRecord的并不总是产生你的查询你想要的顺序,这可能会导致不可预测的结果。 例如,这种模式:

        $this->db->select('page, content');
        $this->db->from('table');
        $array = array('title' => $searchq, 'content' => $searchq);
        $this->db->or_like($array, 'both'); 
        $this->db->where('showsearch', 'Yes'); 
        return $this->db->count_all_results();

产生这个查询:

        SELECT COUNT(*) AS `numrows`
        FROM (`table`)
        WHERE `showsearch` =  'Yes'
        AND  `title`  LIKE '%term%'
        OR  `content`  LIKE '%term%'

但我想对于检查showsearch在查询,这就是为什么我把它放在那里摆在首位年底完成。 但是ActiveRecord的它移动到查询中,我得到的结果是不准确的。



Answer 7:

有一个巨大的优势,以使用查询的对象模型。 虽然你可以执行字符串分析和连接了几个功能,建立一个查询,这是耗时且非常容易出错。 与对象模型,你可以沿着引用传递,并继续构建查询或传递预处理器执行之前。

一个人为的例子可能是自动的日期过滤器添加到所有查询表,并CREATION_DATE场。

CI还可以让你拌生SQL与对象模型相当好。 基本上,你构建一个返回结果水合物对象的自定义查询。



文章来源: CodeIgniter Active Record vs. regular queries