web-dev-qa-db-ja.com

Codeigniterの「where」と「or_where」

モデルでクエリを指定しようとしています

$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にあります。 oravailable_untilフィールドのみに制限したい。現在、しかし、私は私が望むものではないドイツ語の言語を持っている結果を得ています。 or_whereフィルターをavailable_untilフィールドのみに制限するにはどうすればよいですか?

15
garethdn

次の2行のみを変更できます。

->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パラメーターが存在するのは、関数が2番目のパラメーターが値である必要があるためであり、1つがないため、NULLを送信します。

27
Yan Berk

コードを次のように変更できます。

$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')

ヒント:生成されたクエリを見るには、$ this-> db-> last_query()を使用できます。

14
m4t1t0

Codeigniterのgroupingメソッドにより、library.available_untilwheresエリアをグループ化できます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

12
MERT DOĞAN
$this->db->where('(a = 1 or a = 2)');
2

使用できます:クエリのグループ化により、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

2
c.brahim