我在混合$ this-> db-> where()和$ this-> db-> query()时遇到了一个奇怪的现象。
if (!empty($args) && is_array($args)) {
foreach ($args as $key => $value) {
$this->db->where_in($field, $value);
}
}
$result = $this->db->query('SELECT * FROM ...')->result_array();
虽然我可以理解最好不要混合ActiveRecord和常规查询,但我遇到我用$this->db->where_in()
构建的WHERE子句正在影响后续查询(即,子句在下一个查询中执行)
我的所有查询都应该重写为不使用ActiveRecord,还是只使用ActiveRecord?或者有没有办法防止这种“冲突”?我想过$ ths-> db-> flush_cache()但我没有使用数据库缓存,使用它似乎没有任何影响。
答案 0 :(得分:1)
我建议不要在循环中调用db->where_in
。改为考虑
if (!empty($args) && is_array($args))
{
foreach ($args as $key => $value)
{
$values[] = $value;
}
$this->db->where_in($field, $values);
}
实际上,如果$ args是索引(而不是关联)数组,则不需要循环。您只需删除foreach
并使用
$this->db->where_in($field, $args);
您可能不应该混合使用Query Builder(以前称为Active Record)和db->query()
。查询生成器(QB)方法基本上汇编了一个语句,您将提供给db->query()
,然后,几乎字面上调用query("The statement that QB built")
。
IMO,输入查询语句并在$this->db->query("Select * from ...");
中使用它几乎总是更容易。查询生成器很棒,但通常更值得工作。
在您的示例中,您应该坚持使用Query Builder。这仍然可以非常简洁。如果您要从单个表格中查找所有字段,那么db->get
将完成这项工作。
$result = $this->db->get('table_name')->result_array();
通常,当使用get,insert或update调用执行语句时,QB会清除创建的所有元素。您可以通过此通话随时重新开始。
$this->db->reset_query();