エス技研

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の関連記事

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 5.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する

CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。

CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説

CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。

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

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

URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開

URL短縮サービス「TTTオンライン(https://ttt.onl)」を公開。メールやSNSでは使いにくい長いURLを短いURLに変換するサービス。QRコードも。Google URL Shortenerが2019年3月にサービス終了。

CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説

CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP 2.3で saveの便利な使い方・サンプルソース付き

CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。

CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll

主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。

CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法

CakePHP3で検索をするプラグイン「friendsofcake/search」の検索条件のカスタマイズ方法の解説。検索項目を増やしたり、以上、以下での検索や、チェックボックスによる検索の方法などを解説。

CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2
CakePHP3のUpload Plugin 3.0をバリデーションなど実運用向けのカスタマイズ方法解説・その2

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその2でバリデーションなどの実用的なカスタマイズ方法を解説。