fuelphpのORMはwhereで=と=>でSQLが違う?

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

 

PHP
この記事の投稿者
AKI

ソフトウェアエンジニア歴10年以上、業務系システムからゲーム開発まで幅広く経験し
現在はフリーランスプログラマとして従事している。
得意言語: PHP, JavaScript, Java, C#(Unity)

フォローする
フォローする
スポンサーリンク
WoW creators

コメント

タイトルとURLをコピーしました