fuelphpのORマッパーを使いデータアクセスする際のwhere句ですが、
arrayの=と連想配列の=>(ダブルアロー)の形式で発行されるSQLは同じかと思っていたが実際は違ったのでメモ。
whereで=と=>で発行されるSQLが違うって知らなかった。
Model_Test_Table::find('all', [ 'where' => [ ['col1', '=', 'hoge'], ['col2', '=', 'foo'], ], ]); var_dump(\DB::last_query()); Model_Test_Table::find('all', [ 'where' => [ ['col1' => 'hoge'], ['col2' => 'foo'], ], ]); var_dump(\DB::last_query());
SELECT t0.id AS t0_c0 ・・・省略 FROM test_table AS t0 WHERE t0.col1 = 'hoge' AND t0.col2 = 'foo' SELECT t0.id AS t0_c0 ・・・省略 FROM test_table AS t0 WHERE (t0.col1 = 'hoge') AND (t0.col2 = 'foo')
なんと=>の場合は括弧で括られたSQLがORMから発行されていた。
このままだと特に意識することもないと思うが、
ちなみに気になったのでこうしてみると
Model_Test_Table::find('all', [ 'where' => [ ['col1' => 'hoge'], ['col2' => 'foo'], ['col3', '=', 'bar'], ], ]); var_dump(\DB::last_query());
括弧で括られていない条件句が上にきた。。
MySQL側でオプティマイザが使用インデックスは最適化することもありますがこれは意図しないクエリ実行にならないように注意だ。
SELECT t0.id AS t0_c0 ・・・省略 FROM test_table AS t0 WHERE t0.col3 = 'bar' AND (t0.col1 = 'hoge') AND (t0.col2 = 'foo')