CodeIgniter Active Record or_where()函数在sql中产生AND?

时间:2012-03-14 16:36:39

标签: php codeigniter activerecord

我在CodeIgniter中写了一个活动记录查询,然后我意识到我需要对WHERE子句使用OR。所以我查看了文档并找到了做我想要的东西。但是当我使用它时它会在输出中产生AND。我在这个问题上找不到任何其他问题。

我正在使用CodeIgniter:2.1.0

这是我的代码(略微减少):

$这 - > DB->选择( “P *”。,FALSE);

$this->db->from('projects p');
$this->db->join('customers c', 'p.c_id = c.c_id','left outer');

if(isset($options['add_root']))
  $this->db->or_where('p.p_id=',1,FALSE);

//Get top level projects by default (1) or whatever parent is specified.
if(isset($options['p_id']))
  $this->db->where('p.p_id=',$options['p_id'],false);

$query = $this->db->get();//query

2 个答案:

答案 0 :(得分:1)

我认为你不需要or_where。我认为你在PHP中需要更好的if / else。

你可能想要的逻辑:

if(isset($options['p_id']))
{
    // if p_id is set, then look for p_id
    $this->db->where('p.p_id=',$options['p_id'],false);
    // if p_id and add_root are set, then look for p_id OR p_id = 1
    if(isset($options['add_root']))
        $this->db->or_where('p.p_id=',1,FALSE);
}
elseif(isset($options['add_root']))
{
    // look for p_id = 1 only
    $this->db->where('p.p_id=',1,FALSE);
}

因为or_where是第一个,它只是默认为where,然后后续where是默认值:“和”。

您也可以使用一系列elseif来编写上述内容,但我认为这不太明确:

if(isset($options['p_id']) && isset($options['add_root']))
    $this->db
       ->where('p.p_id=',$options['p_id'],false)
       ->or_where('p.p_id=',1,FALSE);
elseif(isset($options['p_id']) || isset($options['add_root']))
    $this->db
       ->where('p.p_id=',
               // if add_root is set, then 1, otherwise p_id
               (isset($options['add_root'])?1:$options['p_id']),false);

答案 1 :(得分:1)

您尝试运行的查询顺序存在一个小错误。您可以添加多个'其中'子句将转换为带有' AND'的查询。之间。但如果你想使用' OR'相反,你使用' or_where'。

在您的查询中,您使用过' or_where'条款,这是正确的,但你已经使用了'其中'在那之后,它实际上加起来以前的查询。所以,你必须使用' where'首先使用子句然后使用' or_where'子句。

只需更改订单即可。