はじめに
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()
というものが使えます。