目前我使用笨定期查询,即:
$sql = "
SELECT *
FROM my_table
WHERE item_id > 1
";
$q = $this->db->query($sql);
我已经开始寻找到的ActiveRecord,并且它看起来美观大方,并具有无论哪个数据库驱动程序使用的正在修建的查询的优势 - 但是,我严格地使用每个在一般项目一个单一的数据库类型,所以这不是一个真正的受益于我。
我发现,经常查询(正如我在我的例子)更容易阅读和维护在我看来,所以我目前想定期查询保持的。
除了上面提到的原因,这是我应该选择,出于什么原因(S)?
谢谢
很适合我,我更喜欢运行的常规查询,CI的活动记录要消耗多少内存。 因为它会加载所有结果在存储器中。 如果你明白我的意思。 至于复杂性,最好去定期查询而坚持CI的活动记录的语法时才。
我倾向于选择ActiveRecord的大部分。 我觉得它更具可读性,它使得构建动态查询,你不必猴子周围的原始SQL的明确串联在一起的块太大容易得多。 这意味着我可以添加各种条件句我查询建设者很少做文章,用的东西,很容易读出来。
有一些事情为其笨实现的ActiveRecord的是很差适合(和让我怀念学说),我直接使用SQL为,但它不会经常发生。
那么对于你在哪里写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();
近两年后,我发现这个问题。 我的一些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的,它可以帮助很多,仍然做出快速和可读性查询。
好了,我的主要的原因是,它快速和安全。 由于自动转义值等等。但是,当涉及到复杂的查询的话,建议用一个正常的查询字符串。
(不谈论加入等等。因为笨支持它相当不错,可读性)更多类似支点查询的,或选择由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();
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的它移动到查询中,我得到的结果是不准确的。
有一个巨大的优势,以使用查询的对象模型。 虽然你可以执行字符串分析和连接了几个功能,建立一个查询,这是耗时且非常容易出错。 与对象模型,你可以沿着引用传递,并继续构建查询或传递预处理器执行之前。
一个人为的例子可能是自动的日期过滤器添加到所有查询表,并CREATION_DATE场。
CI还可以让你拌生SQL与对象模型相当好。 基本上,你构建一个返回结果水合物对象的自定义查询。
文章来源: CodeIgniter Active Record vs. regular queries