Codeigniter 的 `where` 和 `or_where`

问题描述 投票:0回答:6

我正在尝试在我的模型中指定一个查询

$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
字段?

php mysql codeigniter activerecord
6个回答
38
投票

您可以只修改这两行:

->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。


28
投票

您可以通过 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


17
投票

您可以将代码更改为:

$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();

8
投票

您可以使用: 查询分组允许您通过将它们括在括号中来创建 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


4
投票
$this->db->where('(a = 1 or a = 2)');

0
投票

您可以根据自己的选择使用其中任何一个

1。您可以手动编写自己的子句:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

2。 $this->db->or_where() :此函数与上面的函数相同,只是多个实例通过 OR 连接:

$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);  // Produces: WHERE name != 'Joe' OR id > 50
© www.soinside.com 2019 - 2024. All rights reserved.