エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法

      2023/12/28

CakePHP3、CakePHP4で同一テーブル内の値を比較してレコードを取得する方法

 
CakePHP3、CakePHP4で、同一テーブル内にある項目の値を比較し、同じ値であればそのレコードを取得する記述の仕方を紹介します。
 
 

取得対象のテーブル構造とデータ

 
下記のような「users」テーブルがあるとします。
 
Table users
 
id name tel fax
----------
01 taro 111 121
02 jiro 112 112
03 sabu 113 null
 
上記のテーブル内の「tel」の値と「fax」の値が同じ(or違う)レコードを取得する記述方法を解説します。
 
 

素の SQL文で記述

 
SQL文で記述する場合は下記になるかと思います。
 
「tel」と「fax」が同じレコードを取得する場合の SQL文。
select * from users
where tel = fax;
 
「tel」と「fax」が違うレコードを取得する場合の SQL文。
select * from users
where tel != fax;
 
 

CakePHPのクエリービルダーの記述方法で記述

 
CakePHPのクエリービルダーの記述方法を用いて記述すると下記のようになります。
 

$conditiosns = ["tel = fax"];
$users = $this->Users->find()->where($conditiosns)->all();

 
 
「tel」と「fax」が違うものを取得する場合は下記となります。
 

$conditiosns = ["tel != fax"];
$users = $this->Users->find()->where($conditiosns)->all();

 
 

CakePHPのクエリービルダーの記述方法の解説

 
分かってしまえば、素の SQL文と同じように「"tel = fax"」と記述することは当然のように思います。
 
ですが、私は下記のように記述してエラーが発生し、しばらく悩んでいました。
 

$conditiosns = ["tel" => "fax"];
$users = $this->Users->find()->where($conditiosns)->all();

 
ちなみに、エラーメッセージは「Cannot convert value of type string to integer」でした。
 
 
CakePHPの処理で where句に記述する条件の配列としては
 
$conditiosns = [“項目名” => “値”];
と記述すると認識していましたので、
 
$conditiosns = [“項目名 = 項目名”];
 
と記述する発想にはなかなか行き着かず、結構な時間悩んでいました。
また、探すキーワードが悪いのか、ネットを探しても見つかりませんでしたので、こうして記事にさせていただきました。
 
同じことで悩むことがなくなりますように!
 
 

CakePHP4の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る

他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP3でテーブルにカラムを追加したときに変更するポイントのまとめ
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ

CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。

CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法

CakePHP4、CakePHP5でクリエビルダーを利用してテーブルからレコードを取得する際、asを使用してカラムの別名で値を取得したい場合の対応方法を解説。また、別名にはハイフンやアスタリスクなど使用できない文字がある点も解説。

CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数

CakePHP3で特定フォルダのパスの定数を解説。root、DocumentRoot、app、config、webroot、tests、tmp、cache、vendor、コア、コアの srcが設定済み。realpath()関数を使うと柔軟なパス指定が可能。

CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法

CakePHPのバージョンの調べ方2点を紹介。CakePHP3~CakePHP5は共通だが CakePHP2はフォルダ構成が異なるためコマンドのパスもオプションも異なる。

CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法

CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。

CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力

CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。

CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法

CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。

CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説

CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。