CakePHP3を触ってみました 〜IS NULL 他〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
仕分け

この記事を三行にまとめると

CakePHP3だと明示的にISを入れないといけないらしい
nullが入る可能性があるならとりあえずISを入れとけ
さすがに自動で振り分けるところまではやってくれない
たいした話ではないのですが、MySQLのWHERE句で「id IS NULL」を使う時、CakePHP3だと明示的にISを入れないといけないらしいです。正確には、nullデータを参照する時はISを入れておかないと正しい動きにならないようです。

$query = $this->find();

//正しい動きをする
$query->where(['id IS' => null]);

//正しい動きをしない
$query->where(['id' => null]);

こんな感じです。

じゃあ必ずしもnullデータを参照するとは限らない場合はif文で分けなきゃいけないのかってーと、そんなことはないらしいです。

$query = $this->find();
$query->where(['id IS' => $id]);

こうしておけば、$idがnullの時はIS NULLになるし、そうじゃない時は普通の「id = 1」みたいなSQL文にCakeさんが自動で振り分けてくれます。なので、nullが入る可能性があるならとりあえずISを入れとけってことですね。

絶対にnullしか入らないって場合はキーと値の形にしなくても良いです。

$query = $this->find();
$query->where(['id IS NULL']);

CakePHP2でもこの書き方はできましたね。

NOTの場合は二パターンの書き方があります。

$query = $this->find();
$query->where(['id IS NOT' => $id]);

$query->where(['NOT' => ['id IS' => $id]]);

たぶんどちらでも問題ないと思います。僕が試した限りでは同じ動きをしたのですが、間違ってたらすまん。



ちなみにIN句もCakePHP3では明示的にINを書かないと正しく動きません。

$query = $this->find();
$query->where(['id IN' => $id]);

INを入れ忘れると、$idが配列だった時は「id = 1」と同じ動きをします。

$query = $this->find();
$query->where(['id' => [1,2,3]]);

//実行されるSQL
SELECT * FROM table WHERE id = 1

エラーが出るわけじゃないからうっかり気づかない場合があるかもしれない。

NOT INも同じっすね。

$query = $this->find();
$query->where(['id NOT IN' => $id]);

$query->where(['NOT' => ['id IN' => $id]]);

やっぱりどちらの書き方でも大丈夫そうです。






知ってればたいしたことないのですが、知らないとなぜか思うような動きにならなくて何でやねんって思うポイントだと思うんで、「あれれ〜?」って思った場合はこの書き方を思い出してください。僕はIN句の方でしょっちゅうINを入れ忘れて「またかよ……」ってやっております。

ちなみにさすがにIN句とIS NULLを自動で振り分けるところまではやってくれないみたいなので、両方が来る可能性がある場合は、自分でif文で分けるしかないかなぁ。



その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください