LoginSignup
0
1

More than 3 years have passed since last update.

FuelPHP・SQL で where句 と or_where句 を同時に使うとき

Posted at

はじめに

selectするときに、whereとor_whereを同時に使うときは注意しないと思っているようなクエリが発行されません。これは、論理演算子に優先順位が設定されているためです。(orよりandの方が優先順位が高いため)
https://dev.mysql.com/doc/refman/5.6/ja/operator-precedence.html

どういったクエリが発行されるか見ていきたいと思います。
また、whereはand_whereと書くこともありますが、今回はwhere、or_whereで統一します。

環境

PHP 5.3.29
FuelPHP 1.7.3
MySQL 5.5.61

本題

まずはor_whereから。

sample1.php
  public static function sample1()
  {
    $query = \DB::select()
    ->from('table_name')
    ->or_where('column1', '=', 0)//条件1
    ->or_where('column2', '=', 0)//条件2
    ->execute()
    return $query;
  }

この場合はおそらくイメージ通り条件1または条件2となります。
ではここにwhere句を入れるとどうなるか。

sample2.php
  public static function sample2()
  {
    $query = \DB::select()
    ->from('table_name')
    ->or_where('column1', '=', 0)//条件1
    ->or_where('column2', '=', 0)//条件2
    ->where('column3', '=', 0)//条件3
    ->execute()
    return $query;
  }

こうすると発行されるクエリは、条件1または(条件2かつ条件3)となり、後半に書かれたwhere句の処理が優先されます。
(条件1または条件2)かつ条件3としたい場合は、

sample3.php
  public static function sample3()
  {
    $query = \DB::select()
    ->from('table_name')
    ->where_open()
      ->or_where('column1', '=', 0)//条件1
      ->or_where('column2', '=', 0)//条件2
    ->where_close()
    ->where('column3', '=', 0)//条件3
    ->execute()
    return $query;
  }

という書き方をする必要があります。同様に、またはのくくりを大きくしたい場合はor_where_open(),close()というものが使えます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1