我试图在我的模型中指定一个查询
$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
字段?
您可以只修改这两行:
->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。
您可以将代码改成这样:
$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();
您可以使用 Codeigniter 的 grouping 方法对 library.available_until where 区域进行分组,而无需禁用转义 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