CakePHP3でdeletedがNULLのレコードを絞り込みたい

以前こんな記事を書きました。

CakePHP3でUsersテーブルにroleカラムを追加し、管理者と一般利用者で権限を分けたい - 29歳からエンジニア目指すブログ

論理削除されたユーザーでログインさせたくないという記事です。

こちらでも少し触れていますが、「deletedがNULLのレコードを選択したい」とかいうことがあると思います。

つまり、deletedがNULLであるレコードを選択したい、言い換えれば、論理削除されてないレコードを選択したい、ということですね。

この時の書き方はハマる方もいるので、書いていきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

書き方は「'Photos.deleted IS'=>NULL」みたいにする

実際に書き方を見ていきましょう。

例えば、Photosテーブルのデータ(写真)を絞り込みたいとします。

条件は「削除されていないこと」です。

つまりdeletedカラムがNULLということです。

以下のコードを書きました。

(該当のコントローラ)

$photos = $this->Photos->find('all',[
            'conditions'=>[
                            'Photos.deleted IS'=>NULL,
            ],
            'order'=>['id'=>'asc'],
            'limit'=>10]);

findメソッドの説明は省略します。

ここではconditionsを使って絞り込んでいます。

「'Photos.deleted IS'=>NULL」とすることで、「PhotosテーブルのdeletedカラムがNULLであるレコードに絞る」という意味になります。

ポイントは「IS」を記述しているところです。

これを「'Photos.deleted'=>NULL」としても動きません。

注意したいところです。

終わりに

以上となります。

この「IS」を忘れることで上手く動かないということがありました。

NULLは特別な値なので、「IS」が必要になるみたいです。

その辺はデータベースやSQLを勉強するとわかってくるかもしれません。

もっといい書き方があったらコメントで教えてください。

ありがとうございました。