CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
2025/03/23
CakePHP4系、CakePHP5系の exists()でカラムの値の有無チェック
CakePHP4系、CakePHP5系で、特定のカラムに値があるかどうかをチェックする際は「exists()」を使用します。
具体的な使い方は、下記となります。
|
1 2 3 4 5 |
if($this->"Model名"->exists(["カラム名"=>"値"])){ echo "True"; } else { echo "False"; } |
値があれば「true」、値がなければ「false」となります。
CakePHP4系、CakePHP5系の exists()でカラムの値の有無チェックの使用例
|
1 2 3 4 5 |
public function view($id = null) { $user = $this->Users->get($id, contain: []); $this->set(compact('user')); } |
上記は、Bakeで自動生成した Controllerの viewアクションのソースコードです。
この自動生成されたソースの処理で動作はするのですが、一般に公開して多くの方に使ってもらうシステムとしては、不具合が発生しないようにもう少し処理を加える必要があります。
具体的には、今回の記事の内容である引数として指定する「$id」に入る値のチェックです。
例えば、引数となる「$id」の値がない場合や、値はあっても存在しない IDが指定された場合などはエラー画面が表示されてしまいますので、これらが出ないようにする必要があります。
「$id」が指定されていなかった場合のエラー
「Record not found in table 」users with primary key [NULL].
Cake\Datasource\Exception\InvalidPrimaryKeyException
「$id」に存在しない IDが指定された場合のエラー
「Record not found in table 」users.
Cake\Datasource\Exception\RecordNotFoundException
「exists()を使用して値をチェックするサンプルソース
上記の問題点を踏まえて、最低限の処置として、「$id」の値の有無と、存在チェックを追加したものが下記になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public function view($id = null) { // 引数のチェック・$id の値の有無 if(!$id){ return $this->redirect(["action" => 'index']); } // 引数のチェック・$id の値の存在チェック if(!$this->Users->exists(["id"=>$id])){ return $this->redirect(["action" => 'index']); } $user = $this->Users->get($id, contain: []); $this->set(compact('user')); } |
上記のように、「Users」テーブルの「id」というカラムに「$id」の変数に入っている値があるかどうか、をチェックする際に「exists()」を使用します。
値が存在しているときに「true」になりますので、それの否定形の「!」を使って、値がない時はリダイレクトをする処理にしています。
「exists()を使用して値が空の場合も含めてチェックするサンプルソース
ちなみに下記のように、引数がないときの値を nullではなく「$id = ""」にすることで、値の有無チェックをしないようにすることもできます。
|
1 2 3 4 5 6 7 8 9 10 |
public function view($id = "") { // 引数のチェック・$id の値の存在チェック if(!$this->Users->exists(["id"=>$id])){ return $this->redirect(["action" => 'index']); } $user = $this->Users->get($id, contain: []); $this->set(compact('user')); } |
ただ、下記のような条件が入ってきますので、あんまりメリットがないようにも思います。
※idのように「空」の値がないカラムをチェックすることが前提となります。
※「空」をチェックするため、nullがあっても該当なしとなります。
※「null」のチェックは「["id is"=>null]」とする必要があります。
exists()でカラムの値の有無チェックのバリエーション
上記の例は、値を探すカラムを「id」としていますが、カラム名を指定する事でテーブル内のどのカラムでも対応できます。
例えば、ログインする際のログイン IDとして使用する「login_name」というカラムがありその値を探す場合は、下記のように「カラム名」のところに「login_name」を指定する事になります。
|
1 2 3 4 5 |
if($this->Users->exists(["login_name"=>"sample03"])){ echo "True"; } else { echo "False"; } |
値があるかどうかをチェックする機能ですので、例えば「department(部)」を条件にチェックする場合は、「1」に該当するレコードは複数ありますが、この時も 1件以上あれば「true」になります。
|
1 2 3 4 5 |
if($this->Users->exists(["department"=>1])){ echo "True"; } else { echo "False"; } |
さらには、「$this->ContractSeos->find()->where([条件])」でレコードを探すときと同じように、「値の大小」や「like %値%」、複数の条件を組み合わせて「and条件」「or条件」も使用することができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// id が 100より大きいものがあるかないか if($this->Users->exists(["id >"=>100])){ echo "True"; } else { echo "False"; } // email に「example.com」が含まれるものがあるかないか if($this->Users->exists(["email like"=>"%example.com%"])){ echo "True"; } else { echo "False"; } // email に「example.com」が含まれる、かつ、department が「1」のもの if($this->Users->exists(["email like"=>"%example.com%","department"=>1])){ echo "EmailTrue"; } else { echo "EmailFalse"; } // email に「example.com」が含まれる、もしくは、department が「1」のもの if($this->Users->exists(["or"=>["email like"=>"%example.com%","department"=>1]])){ echo "EmailTrue"; } else { echo "EmailFalse"; } |
Containでアソシエーション先のテーブルを含めた状態では「exists()」は使えない
「exists()」は、一つのテーブル内のカラムと値を指定して、レコードが存在するか否かをチェックする関数です。
そのため、Contain句を使用してテーブルを連結して条件を指定するような使い方はできないようです。
そのため、テーブル連結をしてレコードの有無を調べる場合は、下記のように「first()」を使って 1件取得してみるか、「isEmpty()」を使って空なのかどうかを調べる方法があります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$conditions = [ 条件 ]; $contain = [ テーブル連携 ]; if($this->Users->find()->where($conditions)->contain($contain)->first()){ echo "レコードあり"; } else { echo "レコードなし"; } if($this->Users->find()->where($conditions)->contain($contain)->all()->isEmpty()){ echo "レコードなし"; } else { echo "レコードあり"; } // 下記のような使い方は想定されておらずエラーになる // if($this->Users->find()->where($conditions)->contain($contain)->exists()){ |
「first()」の時は「true」は「レコードがある」時であり、「isEmpty()」の時は「true」は「レコードがない」時であるという点を注意して if文の分岐を構成する必要があります。
CakePHP 4.3 以降は「isEmpty()」の使い方が変更されている
CakePHP 4.3 以降では「isEmpty()」の使い方が変更されているようで、「isEmpty()」を使う際は「all()」が必須となったようです。
|
1 2 3 4 5 6 |
// CakePHP 4.3.0 からは非推奨 $query->isEmpty(); // CakePHP 4.3.0 以降は下記のように記述する $results = $query->all(); $results->isEmpty(); |
CakePHP4 Cookbook データの取り出しと結果セット
https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html#query-resultset
CakePHP5の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
getParam('action')で取得するアクション名は別関数に移動しても不変CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
その他の「CakePHP5」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。
-
-
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でJavaScriptやCSSを編集する基本形から、それらやテンプレート(エレメント)を特定のテンプレートを読み込んだときのみ編集、実行するための方法、ブロック化について解説。
-
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
-
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
CakePHPのバージョンの調べ方2点を紹介。CakePHP3~CakePHP5は共通だが CakePHP2はフォルダ構成が異なるためコマンドのパスもオプションも異なる。
-
-
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。