エス技研

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


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

      2019/07/22

CakePHP3で他のテーブルのマスタテーブルからセレクトボックスを作る

 
マスタのテーブルを作成し、そのマスタテーブルの情報を基にしてセレクトボックス(プルダウンリスト)を作成する方法を解説します。
 
具体的には、下記の「Master Roles(権限マスタ)」の項目をテーブルから取得するイメージです。
 
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
 
 

想定しているテーブル

 
想定しているテーブルは、以下の「ユーザテーブル」と「権限マスタテーブル」です。
 
ユーザ情報に、権限マスタから権限情報を編集できるようにしたのち、ユーザ認証機能を実装し、ユーザの持つ権限によって利用できる機能、できない機能を振り分けることを想定しています。
そのために、ユーザ情報の登録の際に「権限」をプルダウン(セレクトボックス)で選択できるようにする、というのが趣旨になります。
 
【ユーザテーブル】

 
【権限マスタ】

 
想定しているテーブルは上記のような形で、「ユーザテーブル」の 4項目目に「権限マスタ」の IDを編集することを想定しています。
 
 


 

セレクトボックスを作成するサンプルプログラム

 
基本的な処理は「cake bake all users」コマンドで生成しています。
そのうえで、加える処理についての解説です。
 
 

/src/Controller/UsersController.php の変更

 
下記のとおり、コントローラーの最初の方に「use Cake\ORM\TableRegistry;」を追記します。
これを追記することで、コントローラーに関連しない他のテーブルの情報を取得することができるようになります。
 

 
 
続いて、「UsersController」の中に「initialize()」関数を追加します。
7行目の「master_roles」が読み込むテーブル名になり、複数ある場合は複数行記述します。
 

 
2019.07.22 追記
CakePHP3.6から、TableRegistryクラスの使用方法が変更になりました。
そのため、上記のサンプルコードでは両方を併記しています。
 
 
続いて、「initialize()」のすぐ後ろに「beforeFilter()」を追加します。
 

 
上記は、「delete_flag」の有無によって変数を 2つに分けています。
プルダウンの生成には、「delete_flag」がないもののみを使いますので、「$masterRolesVaild」の方を使います。
 
ですが、すでにマスタを削除していても、そのマスタの値を持つレコードが残っている可能性がある場合などは、「$masterRolesAll」を使う場合があるのではないか、と思い作成しています。
 
マスタを削除する際に、そのマスタのコードを利用しているレコードをチェックするなど、マスタ管理がしっかりできていてる場合は「$masterRolesVaild」の方だけあれば足りるでしょう。
 
 
ちなみに、ここでのサンプルは、権限マスタから全件取得したうえで、プログラムの処理として、「delete_flag」の値で振り分け処理をしています。
ですが、そもそも権限マスタテーブルから値を取得する際に「delete_flag」によって振り分けたレコードを取得する場合は、下記の様に where句を追加することも可能です。
 

 
 
また、「$masterRolesAll」「$masterRolesVaild」の変数を「beforeFilter()」で作成しています。
これは、Usersコントローラーの中のすべてのアクションで使えるようにするためです。(今回は、index、add、editで使うためです。)
 
特定のアクションだけで使えればいい場合は、3~10行目を特定のアクションの中に移しても問題ありません。
 
 

/src/Template/Users/index.ctp の変更

 
index.ctpは、以下のように変更します。
ここでは、一覧表示する際に、権限コードを表示するのではなく、権限名称を表示するようにしています。
 

 
 

/src/Template/Users/add.ctp の変更

/src/Template/Users/edit.ctp の変更

 
add.ctp、edit.ctpは以下のように変更します。
新規登録、更新の画面では、プルダウンで権限を選択できるようにしています。
セレクトボックス(プルダウン)に編集する値は、「options」に連想配列で、キーと値を渡すだけで作成してくれます。
 

 
CakePHP3の Form Helperの使い方については、「CakePHP3のForm Helperの使い方のまとめ」に記事を書いていますので参照してください。
 
上記の Form Helperの使い方を読んでもらえば分かりますが、プルダウンリスト(セレクトボックス)をラジオボタン変えたい場合は、「"type"=>"select"」を「"type"=>"radio"」にすれば OKです。
 
また、「"empty"=>"選択してください"」は、最初に nullの値を入れる場合の設定です。
今回の紹介している「権限」は必須項目となるべき項目ですので、「"empty"=>"選択してください"」は消す方が無難かもしれません。
 
また、先ほどの「"type"=>"select"」を記述しなくてもデフォルトでプルダウンリストになりますので、下記の様に短く記述することも可能です。
 

取得したテーブルの値のオブジェクトを配列にする方法

今回は、UsersController.phpで配列を生成するという仕組みで構築しましたが、テーブルから取得した値をオブジェクトのまま View側に渡す場合もあるかと思います。

そんな時、特定のレコードを自由に扱えるようにするには配列にする必要があるのだと思いますが、その方法について調べた内容を下記の記事にしていますので、あわせて参考にしてください。
 CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
 
 

CakePHP3の関連記事

CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

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

Comment

  1. かみおか より:

    まさにこの処理を書きたくてググってたら辿り着きました。私は今回のプロジェクトからCakePHP3で開発を始めたんですが、まだ日本語ノウハウの積みあげはこれからっぽい感じなので、すごく助かりました。ありがとうございます!

    • エス技研 より:

      かみおかさん、コメントありがとうございます!
      書いた記事がお役に立ったということで、すごく嬉しいですね。
      役に立ったという書き込みをいただくだけで、1週間は頑張って仕事ができます!
      引き続き役に立つ記事を書いていきますので、今後もよろしくお願いします!

  2. rinko より:

    私もこのコードが書きたくてググりました!
    すごくすごく助かりました!ありがとうございます!

    • エス技研 より:

      rinkoさん、コメントありがとうございます!
      役に立ったと言ってもらえるとすごく嬉しいですね。記事を書いた甲斐があった、と思えますからね。
       
      これがベストプラクティスか分かりませんが、引き続き頑張って記事を書いていきますので、今後ともよろしくお願いします!

Message

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

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

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

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

  関連記事

CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP4の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3、CakePHP4のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説

CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。

CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども

CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合

ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。

CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説

CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。

国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法

CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法

CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。

CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ

CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。