エス技研

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


CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法

      2024/08/25

CakePHP4のクリエビルダーを使用して OR条件を AND条件でつなぐ SQL文を作る方法

 
CakePHP4のクリエビルダーを利用して、下記のように OR条件を AND条件でつなぐ SQL文を生成する方法をお伝えします。
 

select * from users where
 ( pref = "東京" or pref = "大阪" )
 and
 ( age  = "20代" or age  = "30代" );

 
 

CakePHP4のクリエビルダーを使用して OR条件の SQL文を生成する方法

 
まず初めに、OR条件の SQL文を生成する場合の記述方法を解説します。
 
OR条件を設定する場合は、下記のように「or」をキーとして条件を指定します。
 

$conditions = [
  "or" => [
    "pref" => "東京",
    "pref" => "大阪"
  ]
];
$users = $this->Users->find()->where($conditions);

 
生成される SQL文は以下のようになります。
 

select * from users where
 ( pref = "東京" or pref = "大阪" );

 
 

CakePHP4のクリエビルダーを使用して OR条件を AND条件でつなぐ SQL文を生成する方法

 
OR条件が一つの時は上記の記述方法で問題ありませんが、下記のように OR条件を AND条件でつなぐ場合はどうすればいいでしょうか?
 

select * from users where
 ( pref = "東京" or pref = "大阪" )
 and
 ( age  = "20代" or age  = "30代" );

 
 
正解は下記のように、OR条件の変数を 2つ作成し、その条件を 2つの「where()」句をつなげて記述します。
 

$conditions1 = [
  "or" => [
    "pref" => "東京",
    "pref" => "大阪"
  ]
];
$conditions2 = [
  "or" => [
    "age"  => "20代",
    "age"  => "30代"
  ]
];
$users = $this->Users->find()->where($conditions1)->where($conditions2);

 
 
「where()」句を 2つつなげるという記述方法がなんとなく無理やり感を感じてしまいますが。
 
 

参考サイト:CakePHP4 Cookbook

 
参考サイトは下記になります。
オフィシャルの Cookbookですが、今回紹介した内容は明確に書かれていませんので、記事にしてみました。
 
CakePHP4 Cookbook クリエビルダー
https://book.cakephp.org/4/ja/orm/query-builder.html
 
 

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でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

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

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

CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説

入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。

CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介
CakePHP4、5で$_SERVERと同じようにURIを取得する「getUri()」の紹介

PHPでサーバ情報、環境情報を取得する際は「$_SERVER」を利用するが、似たような情報をCakePHPの関数で取得する際は「getUri()」を使用する。取得出来る値は一致するものもあるが、違うものもあり便利な使い方もある。

CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説

CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。

CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説

WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。

CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)

CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。

CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを

CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。