Codeigniter 的 `where` 和 `or_where`
Posted
技术标签:
【中文标题】Codeigniter 的 `where` 和 `or_where`【英文标题】:Codeigniter's `where` and `or_where` 【发布时间】:2013-05-06 02:35:42 【问题描述】:我正在尝试在我的模型中指定一个查询
$this->db
->select('*')
->from('library')
->where('library.rating >=', $form['slider'])
->where('library.votes >=', '1000')
->where('library.language !=', 'German')
->where('library.available_until >=', date("Y-m-d H:i:s"))
->or_where('library.available_until =', "00-00-00 00:00:00")
->where('library.release_year >=', $year_start)
->where('library.release_year <=', $year_end)
->join('rating_repo', 'library.id = rating_repo.id')
所以,我遇到的问题是我的or_where
。我希望 or
仅限于 available_until
字段。但是,目前,我得到的结果是德语,这不是我想要的。如何将我的or_where
过滤器限制为仅available_until
字段?
【问题讨论】:
【参考方案1】:你可以只修改这两行:
->where('(library.available_until >=', date("Y-m-d H:i:s"), FALSE)
->or_where("library.available_until = '00-00-00 00:00:00')", NULL, FALSE)
编辑:
省略 FALSE
参数会将反引号放在方括号之前并使它们成为表名称/值的一部分,从而使查询不可用。
NULL
参数的存在只是因为该函数要求第二个参数是一个值,而由于我们没有,所以我们发送 NULL。
【讨论】:
所以现在可以了,但我不知道为什么。你能解释一下吗?我知道false
可以防止在查询中添加反引号。不过,我不明白这对这个查询有什么影响——我也不确定 null
参数的作用
此方法有效,但不能作为优质代码的标准。你不能在 where 子句中使用未封闭的 pharantesis。【参考方案2】:
您可以通过 Codeigniter 的 grouping 方法对您的 library.available_until wheres 区域进行分组,而不禁用转义 where 子句。
$this->db
->select('*')
->from('library')
->where('library.rating >=', $form['slider'])
->where('library.votes >=', '1000')
->where('library.language !=', 'German')
->group_start() //this will start grouping
->where('library.available_until >=', date("Y-m-d H:i:s"))
->or_where('library.available_until =', "00-00-00 00:00:00")
->group_end() //this will end grouping
->where('library.release_year >=', $year_start)
->where('library.release_year <=', $year_end)
->join('rating_repo', 'library.id = rating_repo.id')
参考:https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping
【讨论】:
【参考方案3】:您可以将代码更改为:
$where_au = "(library.available_until >= 'date('Y-m-d H:i:s)' OR library.available_until = '00-00-00 00:00:00')";
$this->db
->select('*')
->from('library')
->where('library.rating >=', $form['slider'])
->where('library.votes >=', '1000')
->where('library.language !=', 'German')
->where($where_au)
->where('library.release_year >=', $year_start)
->where('library.release_year <=', $year_end)
->join('rating_repo', 'library.id = rating_repo.id');
提示:要查看生成的查询,您可以使用
echo $this->db->last_query(); die();
【讨论】:
【参考方案4】:您可以使用: 查询分组允许您通过将它们括在括号中来创建 WHERE 子句组。这将允许您使用复杂的 WHERE 子句创建查询。支持嵌套组。示例:
$this->db->select('*')->from('my_table')
->group_start()
->where('a', 'a')
->or_group_start()
->where('b', 'b')
->where('c', 'c')
->group_end()
->group_end()
->where('d', 'd')
->get();
https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping
【讨论】:
问题和建议的答案都使用括号,因此您不会添加任何新内容。如果您要添加一个代码示例,您至少可以使其适应提问者的场景。这种情况下的代码没有帮助。【参考方案5】:$this->db->where('(a = 1 or a = 2)');
【讨论】:
以上是关于Codeigniter 的 `where` 和 `or_where`的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择或在 codeigniter 中的 where 和运算符中选择
CodeIgniter 中 Active Record 的“count_all_results”和“where”问题