动态Active Record查询中的Codeigniter括号

Cyb*_*kie 20 mysql arrays activerecord codeigniter

我使用ActiveRecord生成如下查询

SELECT * FROM (`foods`) WHERE `type` = 'fruits' AND 
       `tags` LIKE '%green%' OR `tags` LIKE '%blue%' OR `tags` LIKE '%red%'
Run Code Online (Sandbox Code Playgroud)

数量tags和值未知.数组是动态创建的.下面我添加了一个可能的数组.

$tags = array (                 
        '0'     => 'green'.
        '1'     => 'blue',
        '2'     => 'red'
);  
Run Code Online (Sandbox Code Playgroud)

有一个标签数组,我使用以下循环来创建我发布在顶部的查询.

$this->db->where('type', $type); //var type is retrieved from input value

foreach($tags as $tag):         
     $this->db->or_like('tags', $tag);
endforeach; 
Run Code Online (Sandbox Code Playgroud)

问题:我需要在LIKE下面的子句中添加括号:

SELECT * FROM (`foods`) WHERE `type` = 'fruits' AND 
      (`tags` LIKE '%green%' OR `tags` LIKE '%blue%' OR `tags` LIKE '%red%')
Run Code Online (Sandbox Code Playgroud)

我知道如果括号内的内容是静态的,但是foreach循环将我抛弃,我该怎么做到这一点.

The*_*cer 36

来自CI维基:

codeignighter ActiveRecord功能允许您相对简单地创建SQL查询并且与数据库无关,但是没有特定的支持在SQL查询中包括括号.

例如,当你想要一个where语句与下面的内容相似时:

WHERE (field1 = value || field2 = value) AND (field3 = value2 || field4 = value2) 
Run Code Online (Sandbox Code Playgroud)

这可以通过将字符串提供给CI-> db-> where()函数来解决,在这种情况下,您将需要专门转义您的值.

请参阅以下示例:

$value=$this->db->escape($value);
$value2=$this->db->escape($value2);
$this->db->from('sometable');
$this->db->where("($field = $value || $field2 = $value)");
$this->db->where("($field3 = $value2 || $field4 = $value2)");
$this->db->get(); 
Run Code Online (Sandbox Code Playgroud)

一个类似的解决方法可以用于LIKE子句:

$this->db->where("($field LIKE '%$value%' || $field2 LIKE '%$value%')");
$this->db->where("($field3 LIKE '%$value2%' || $field4 LIKE '%$value2%')"); 
Run Code Online (Sandbox Code Playgroud)

  • 对于任何试图实现此目的的人都要注意:对于转义`LIKE`子句,codeigniter使用`$ this-> db-> escape_like_str($ value)`否则它会在通配符中添加单引号. (3认同)

Rod*_*ira 19

在CI 3.0-dev中,您可以在查询中添加组:

$this->db->select('id, title')
->group_start()
->or_like([ 'title' => $s, 'id' => $s ])
->group_end()                
->where([ 'b_del' => 0 ]);
Run Code Online (Sandbox Code Playgroud)

生产:

SELECT `id`, `title`, `venda1`
FROM `itens`
WHERE   
(
`title` LIKE '%a%' ESCAPE '!'
OR  `id` LIKE '%a%' ESCAPE '!'
 )
AND `b_del` =0 
Run Code Online (Sandbox Code Playgroud)


小智 7

One of best feature to save your query when you applying multiple where or_where clauses.

$this->db->group_start();
$this->db->where();
$this->db->or_where();
$this->db->group_end();
Run Code Online (Sandbox Code Playgroud)

Happy Coding. :)