Codeigniter ActiveRecord和this-> db->查询冲突

时间:2017-09-27 12:56:39

标签: codeigniter activerecord

我在混合$ 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()但我没有使用数据库缓存,使用它似乎没有任何影响。

1 个答案:

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