エス技研

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.

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

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

  関連記事

CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた

CakePHPでレコードを新規登録をする際にnewEmptyEntity()を使って空のEntityを作成するが、これのempty、is_nullなどのでの判定結果がtrueかfalseか確認してみた。

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

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

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

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

CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装

CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。

CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説

responseの値を指定する方法は3系では「body」だが、4系では「withStringBody」になりる。加えてJSON形式なら「withType」で指定するなど4系では結構異なる処理がある。

CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない

CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。

CakePHP3のユーザ管理・認証プラグイン CakeDC/Usersの導入・機能解説・3.1.5対応
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応

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

CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。