一尘不染

动态Active Record查询中的Codeigniter括号

mysql

我正在使用ActiveRecord生成如下查询

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

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

$tags = array (                 
        '0'     => 'green'.
        '1'     => 'blue',
        '2'     => 'red'
);

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

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

foreach($tags as $tag):         
     $this->db->or_like('tags', $tag);
endforeach;

问题:我需要在LIKE子句周围添加括号,如下所示:

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

如果括号中的内容是静态的,但是foreach循环使我失望,我知道如何实现此目的。


阅读 247

收藏
2020-05-17

共1个答案

一尘不染

从CI Wiki:

Codeignighter ActiveRecord功能使您可以相对简单地且独立于数据库地创建SQL查询,但是对于在SQL查询中包含括号没有特定的支持。

例如,当您希望以下语句同时出现where语句时:

WHERE (field1 = value || field2 = value) AND (field3 = value2 || field4 = value2)

可以通过将字符串输入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();

可以对LIKE子句使用类似的解决方法:

$this->db->where("($field LIKE '%$value%' || $field2 LIKE '%$value%')");
$this->db->where("($field3 LIKE '%$value2%' || $field4 LIKE '%$value2%')");
2020-05-17