CakePHP3のORMにおけるIN句とNOT句の記述方法

More than 3 years have passed since last update.

INだけだとググラビリティ低くて情報に行き着くまで時間がかかったのでQiitaにも載せておきます。

今後こういう記事を幾つか書くと思います。


Where In

http://book.cakephp.org/3.0/en/orm/query-builder.html#automatically-creating-in-clauses

use Cake\ORM\TableRegistry;

$users = TableRegistry::get('User')->find()
->where(['User.id IN' => [1, 2, 3]])
->all();

CakePHP2.x系までは条件式のvalueに配列を指定すると自動的にINに切り替わりましたが、

CakePHP3.x系ではbooleanとして解釈され1に変換されます。

idが1のデータが存在するとデータが取れてしまうため案外気付きにくい箇所かもしれません。


Where Not

http://book.cakephp.org/3.0/en/orm/query-builder.html#automatic-is-not-null-creation

use Cake\ORM\TableRegistry;

// IS NOT
$users = TableRegistry::get('User')->find()
->where(['User.id IS NOT' => 1])
->all();

// !=
$users = TableRegistry::get('User')->find()
->where(['User.id !=' => 1])
->all();

// INの時
$users = TableRegistry::get('User')->find()
->where([
'NOT' => ['User.id IN' => [1, 2, 3]]
])
->all();

CakePHP2.x系と同じような否定式が使えます。

INの時はNOTをキーにしてその下に条件式を配置してあげれば上手くいきます。