エス技研

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


CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法

      2019/07/22

ビューで受取ったテーブルのオブジェクトを連想配列に変換

 

オブジェクトを連想配列に変換する解説の前提

 
テーブルから取得したレコード情報(オブジェクト)を、コントローラーからビューに送ります。
その送ったオブジェクトを、ビュー内で連想配列として扱う方法について解説します。
 
 
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る」の記事で利用したユーザテーブルと権限マスタテーブルを利用しています。
というか、「CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る」の記事のあれこれ試す中で確認した内容になります。
 
やりたいことは、「UsersController.php」で取得した「権限マスタテーブル」のオブジェクトを、コントローラーからビューに送信し、ビュー側で「権限マスタ」にある「権限名(master_roles.name)」を、Usersの一覧表の「権限名」のところに編集する方法です。
 
そのため、ビューで受けとたオブジェクトを連想配列に変換する方法を必要としました。
 
 

コントローラーからビューに送る処理

 
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る」のテーブル情報を見ながら確認してほしいのですが、下記の様に「UsersController.php」で権限マスタの情報を取得し、21行目の setで「$masterRoles」変数としてビューに渡しています。
 

 
2019.07.22 追記
CakePHP3.6から、TableRegistryクラスの使用方法が変更になりました。
そのため、上記のサンプルコードも CakePHP3.6 以降の記述方法に変更しました。
 

 
 
 

ビューで受け取り foreach文で処理

 
ビュー側で受け取ったオブジェクトは、下記のようなに foreach文でグルグル回しながら値を取得していくことができます。
 

 
ここまでは特に問題がありません。
 
 


 

問題点:オブジェクトのままでは個別の値が取得できない!

 
ですが、受け取った情報は「権限マスタ」ですので、foreach文でグルグル回しながら使うことはほぼなく、下記のように「0」の位置を指定して値を取得したいわけです。
 

 
ですが、コントローラーからビューに送られる値は、オブジェクトのため、こういう形式で受け取ることができないのです。
 
なので、いろいろ試してみました。
 

 
上記の記述方法ではいずれも「Error: Cannot use object of type Cake\ORM\ResultSet as array」というエラーになるのです。
 
最後の「((array)$masterRoles)[0]->name;」という記述方法は、オブジェクトがネストしていなければ有効なようですが、テーブル情報として送られてくるオブジェクトはネストしていますので、うまく機能しません。
 
 

解決方法:オブジェクトを連想配列にするには toArray()を使う!

 
前置きが長くなりましたが、ようやく解決方法です。
 
ビューで受け取ったオブジェクトを連想配列に変換する方法です。
連想配列に変換できればいつものように連想配列の位置を指定して値を取得できるようになります。
 
下記の様にコントローラーから受け取ったオブジェクト「$masterRoles」を「toArray()」メソッドを使うことで連想配列に変換することができます。
 

 
連想配列に変換できれば、あとは普通の連想配列ですので、0番目のレコードを取得する場合は「$masterRolesArray[0]」と指定することで取得できるようになります。
 
ちなみに、「$masterRolesArray[0]」で取得した中身はまたオブジェクトなので、「name」を取得する場合は「$masterRolesArray[0]->name」となります。
 
 
オフィシャルサイトでは下記の「データのロードに Finder を使う」の中に書いてありました。
https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html#finder
 
 

オブジェクトを連想配列に変換する方法のあとがき

 
この「toArray()」メソッドを知る前は、一度 foreach文でグルグル回して連想配列に置き換えるという処理をしていました。
 
 
今回は、Usersコントローラーから $masterRolesという他のテーブルの情報を読み込んだときの話ですが、マスタ情報を読み込んだときだけの話ではありません。
「http://example.com/Users」で見ることができる一覧ページでは、下記の様に「$users」を foreach文でグルグル回して一覧表を生成する処理があります。
 

 
この Usersのページでも、一覧表を作るというのではなく、「『$users』のオブジェクトから 2件目のレコードの『username』を取得する」という場合も同じように「toArray()」メソッドを使うと連想配列になりますので、下記のような形で値の取得ができるようになります。
 

 
 
まぁ、「toArray()」メソッドを記述するだけで連想配列になるとはいえ、オブジェクトの 2個目の値を使いたい、っていうような要望はよくあると思うので、わざわざ連想配列に変換しなくても利用できる方法があってもよさそうな気がするんですが...
他に方法はないんですかね?
 
ちなみに、下記のサイトを見る感じでは、PHP自体には「toArray()」メソッドはなさそうですね。
http://qiita.com/ymm1x/items/f197ddd327356b1e9088
 
 

CakePHP3の関連記事

CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

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

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

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

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

CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法

CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。

CakePHPを学ぶ際にはオブジェクト指向を学ぼう

CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」

CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。

CakePHP3のForm Helperの使い方のまとめ

CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。

CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法

CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。