差不多两年后,我发现了这个问题。我的一些同事已经回答了几个优点或缺点,我只是想通过我的个人经验添加一个意见:
正如有人所说,我也将使用活动记录和纯粹的直接sql混合起来用于非常复杂的查询,原因是当你需要一个接收很多os参数并相应地改变查询的方法时,它的使用非常简单。举例来说,我有一个接收的称为参数数组“选项”的方法:
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();
当然这只是一个简单的例子,但我已经建造方法与数百行和条件可能会改变一个通用的' get'方法,并且活动记录使其非常好,并且非常易读,因为您不需要在其中间编写代码来正确地格式化查询。
你甚至可以有连接和其他可以有条件的东西,所以你可以使用一个通用的集中式方法,这样可以避免重写大部分代码和复制部分代码(可怕的维护),它不仅可读,但它让你的查询速度快,因为只加载你所需要的:
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查询不会按照您期望的方式工作,因为它会尝试以编程的逻辑方式构建查询,所以在使用'OR'语句时要小心,大多数时间你必须隔离它(和):
$this->db->where('(m.ultimo_status < DATE_ADD(NOW(), INTERVAL -2 HOUR) OR m.ultimo_status IS NULL)');
如果你没有添加(),OR的状态会影响整个where子句。 因此,一旦你习惯了主动记录,它可以帮助很多人,并且仍然可以快速和可读的查询。
只要您发布问题,请接受您满意的答案。 –
嗨拉希尔,我通常会在接受答案时接受答案。我不太确定哪一个可以接受,因为我没有真正回答我的问题。你建议我接受哪一个? –
嗯,我建议@tomexsans更明智,所以我可以说他应该被接受。他对消耗内存是正确的还有一点需要注意的是,运行额外的php函数来构建查询会使进程变得缓慢不快 –