Php 在Codeigniter中组合mysql和OR查询
我想在CI中组合AND或mysql查询。我已看到此线程:。 但他们没有提供确切的解决方案 如何严格使用CI框架创建以下查询?(我可以轻松创建没有括号的查询,但它不是同一个查询。) 注意:这只是一个示例查询,即使没有意义&不要建议将整个或部分查询写入单个Php 在Codeigniter中组合mysql和OR查询,php,mysql,codeigniter,codeigniter-2,Php,Mysql,Codeigniter,Codeigniter 2,我想在CI中组合AND或mysql查询。我已看到此线程:。 但他们没有提供确切的解决方案 如何严格使用CI框架创建以下查询?(我可以轻松创建没有括号的查询,但它不是同一个查询。) 注意:这只是一个示例查询,即使没有意义&不要建议将整个或部分查询写入单个where() 编辑:基本上,我希望实现以下简单查询: SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 查询本身没有意义,
where()
编辑:基本上,我希望实现以下简单查询:
SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3')
查询本身没有意义,您正在选择:
- 托夫·斯文德森,12岁
- Ola Svendsen,12岁
- 任何一个叫斯文森的男性,12岁
- 来自印度的12岁名叫斯文德森的人
$this->db->where('LastName', 'Svendson');
$this->db->where('Age', 12);
$this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR Country='India')", NULL, FALSE);
$query = $this->db->get('Persons');
return $query->result();
当前,使用CI2,如果不扩展数据库类并将方法的访问类型从私有更改为公共/受保护,则无法访问数据库类的查询生成器方法($this->db->u compile\u select()),这将破坏构建子查询的能力,就像您尝试使用ActiveRecord类进行构建一样。创建一个类似于您试图构建的子查询的唯一方法是只使用db query方法
$table = $this->db->dbprefix('tablename');
$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') ";
$this->db->query($sql,array($field1,$field2,$field3));
在上有一篇关于这样做的博文,但它已经过时了,只适用于CI 1.7,希望这会有所帮助。在CodeIgniter 3中,有一些新方法正好用于此目的
return $this->db
->where('LastName', 'Svendson');
->where('Age', 12);
->group_start()
->where('FirstName','Tove')
->or_where('FirstName','Ola')
->or_where('Gender','M')
->or_where('Country','India')
->group_end()
->get('Persons')
->result();
在Codeigniter中,我们可以像这样使用它,这很容易理解
$sql = "SELECT
*
FROM
`Persons`
WHERE
LastName = 'Svendson'
AND Age = '12'
AND (
FirstName = 'Tove'
OR FirstName = 'Ola'
OR Gender = 'M'
OR Country = 'India'
)";
$query = $this->db->query($sql);
return $query->result();
尝试使用
查询分组
它的链接
您可以简单地使用它
$this->db->where("status","live")->or_where("status","dead");
你也可以使用
$this->db->where("(status='live' OR status='dead')");
使用codeigniter 3.0框架,有新功能可用于单独或何处和何处操作,即分组和分组结束 代码像
$this->db->where('LastName', 'Svendson');
$this->db->where('Age', 12);
$this->db->group_start();
$this->db->or_where('FirstName','Tove');
$this->db->or_where('FirstName','Ola');
$this->db->or_where('Gender','M');
$this->db->or_where('Country','India');
$this->db->group_end();
$query = $this->db->get('Persons');
return $query->result();
对于CodeIgniter 2,我需要这个,但我需要的值仍然转义,所以对我来说不好,我不想重写整个查询,就像这样,所以我最终做了以下操作:
$this->db->where('LastName', $lastName);
$this->db->where('Age', $age, false);
$this->db->where('1 AND ( 0', null, false); // This one starts the group
$this->db->or_where('FirstName', $firstName1);
$this->db->or_where('FirstName', $firstName2);
$this->db->or_where('Gender', $gender);
$this->db->or_where('Country', $country);
$this->db->or_where('0 )', null, false); // This one ends the group
$query = $this->db->get('Persons');
这将生成以下查询:
SELECT *
FROM (`Persons`)
WHERE `LastName` = 'Svendson'
AND Age = 12
AND 1 AND ( 0 -- This one starts the group
OR `FirstName` = 'Tove'
OR `FirstName` = 'Ola'
OR `Gender` = 'M'
OR `Country` = 'India'
OR 0 ) -- This one ends the group
与此相同:
SELECT * FROM (`Persons`) WHERE
`LastName` = 'Svendson' AND Age = 12 AND 1 AND
(0 OR `FirstName` = 'Tove' OR `FirstName` = 'Ola' OR `Gender` = 'M' OR `Country` = 'India' OR 0)
该查询只是一个测试查询。我随意写下我想到的任何东西。基本上,我需要f1=v1和(f2=v2或f3=v3)类的查询&而且我的问题不是关于选择,所以你不必分析我的查询,对否决票的人来说很容易,只是想把事情弄清楚。不管怎样,你有没有试过从(“人”)那里得到$this->db->$这->数据库->其中(“LastName”,“Svendson”)$这->数据库->其中(“年龄”,“12”)$这->数据库->或_,其中_位于('FirstName',$FirstName)$这->数据库->或_,其中_在('gender','M')$此->db->or_,其中位于('Country','India')[/code]的或部分不在括号内。您正在生成的是不带括号的查询。我在问题中清楚地提到,
(我可以轻松创建没有括号的查询,但它不是同一个查询。)
是的,这将起作用&这就是我目前使用的。但这不是严格意义上的CI方式,我必须手动转义字符串。另外,我怀疑在问题中提到的这类答案不建议将查询的全部或部分写在一个where()中。
我在最初的回答中问您是否有理由使用活动记录来实现这一点,因为在()中定义查询是“严格的codeigniter”,而不是活动记录。无论如何,这在CI中是不可能的,因为它们不允许您在AR中执行嵌套查询。为此,有一个名为IgnitedQuery的查询字符串生成器:。这对我不起作用。第二个where条件覆盖第一个where条件。CodeIgniter V 2.1.4什么是…NULL,FALSE)
的?NULL是值参数(非强制性),FALSE是删除查询引号(FALSE,因为这会影响括号)。此版本是何时发布的?>现在就是这样做的+如果我错了,请纠正我。除了最后一个分号外,您的声明中是否需要有分号?很抱歉,新到CI,它没有。改变了帖子,展示了如何充分利用这个解决方案让我开心!!!我花了很长时间才想出这个简单的解决办法。谢谢。对我来说,它似乎比内置函数更容易创建!我也会尝试一下
SELECT * FROM (`Persons`) WHERE
`LastName` = 'Svendson' AND Age = 12 AND 1 AND
(0 OR `FirstName` = 'Tove' OR `FirstName` = 'Ola' OR `Gender` = 'M' OR `Country` = 'India' OR 0)