Php CodeIgniter活动记录-组或语句

Php CodeIgniter活动记录-组或语句,php,mysql,codeigniter,Php,Mysql,Codeigniter,这是我的问题: 解决方案是将OR语句分组,但我使用CodeIgniters活动记录。有没有一种方法可以使用Active Record对语句进行分组?还是我必须自己写查询 我正在使用$this->db->where()和$this->db->或\u where() 它这样编写查询: 其中title='foobar'和category=2或category=3 但我需要的是: 其中title='foobar'和(category=2或category=3) 我不能这样做: $this->db-

这是我的问题:

解决方案是将OR语句分组,但我使用CodeIgniters活动记录。有没有一种方法可以使用Active Record对语句进行分组?还是我必须自己写查询

我正在使用
$this->db->where()
$this->db->或\u where()

它这样编写查询:

其中title='foobar'和category=2或category=3

但我需要的是:

其中title='foobar'和(category=2或category=3)

我不能这样做:

$this->db->where("title = 'foobar' AND (category = 2 OR category = 3)");

因为我正在使用foreach循环添加or,所以您不能使用DB活动记录方法(where或_where)操作地面条件查询,我建议在
where()方法中作为sting传递

$this->db->where("category = 1 AND (category = 2 OR category = 3)");

您可以按照以下说明手动执行此操作:

自定义字符串:您可以手动编写自己的子句:

$where=“name='Joe'和status='boss'或status='active'”

$this->db->where($where)

关于你的问题:

$this->db->where("category = 1 AND (category = 2 OR category = 3)");
3.0-dev中:

$this->db->select()
->group_start()
->or_like([ 'category' => 2, 'category' => 3 ])
->group_end()                
->where([ 'category' => 1 ]);
更新 如果使用CI 2.2,请参阅上的答案。选择除已接受答案之外的答案

或者干脆试试:


在Code Igniter版本3.0-dev中,您可以使用group\u startgroup\u end在任何查询中添加组:

$this->db->select('col1, col2')
->where("category = 1")
->group_start()
->where("category = 2")
->or_where("category = 3")
->group_end();
产生:

SELECT `col1`, `col2`
FROM `table_name`
WHERE category = 1 AND (category = 2 OR category = 3);

正如OP提到的,您正在使用foreach
(数组)
你可以简单地使用

    $cat_array=array(2,3,4,5,6,7);
    $this->db->select('col1, col2')->from('table')->where("col1",1)->where_in('col2', $cat_array);
将产生

SELECT `col1`, `col2` FROM (`table`) WHERE `col1` = 1 AND `col2` IN (2, 3, 4, 5, 6, 7) 

我不能这样做,因为我正在使用foreach循环(更新了我的问题),我正在添加带有foreach循环的ORs,所以这不起作用。3.0开发部分看起来正是我需要的,但我使用的是2.2版。你发布的链接的接受答案看起来是一个不错的解决方案,但为什么它有8个否决票?你发布的最后一个代码正是OP自己接受的答案,即“动态生成SQL查询并将其插入$this->db->where()”。我不认为这很难看,这似乎是个好答案。idk为什么有8张反对票?@sol,majidarif。正如我所提到的,CI中有一个内置函数。@DOWNDOVERS似乎表明您失去了字符串验证,但文档中说:where()
传递给此函数的所有值都会自动转义,生成更安全的查询。
我使用的是2.2版,实际上,这不会获取任何行,因为每次都会变成
1和0
0和1
=
FALSE
条件。@karanthakkar这只是一个示例,可以理解一下,但是你是对的,lolcan,你可以发布foreach逻辑吗。如果是数组而不是foreach,则可以使用
where_in
。OP的问题似乎有误导性,他试图构建的查询是错误的。如果是这样的话,那么这就是最好的答案。@majidarif yes may be的问题很容易让人误解:)对于我的问题,我使用so+1中的where_使它工作,但它仍然没有回答我的问题如何使用或
SELECT `col1`, `col2` FROM (`table`) WHERE `col1` = 1 AND `col2` IN (2, 3, 4, 5, 6, 7)