cakephpのアソシエーションについて

このQ&Aのポイント
  • cakephpのアソシエーションについて勉強中です。初心者なのでぜひ教えていただきたいのですが、[Profile]と[Image]というテーブルがあり、ProfileについてImagesとのアソシエーションがhasmanyなのですが、コントローラーで$datas = $this->Profile->find("all"); $this->set("datas",$datas);とした場合、view側でProfileのデータもImageのデータも表示されるにはどうしたらよいのでしょうか。
  • 現在、cakephpのアソシエーションについて勉強中です。初心者なので、[Profile]と[Image]というテーブルについて教えていただけないでしょうか?具体的には、ProfileテーブルとImageテーブルの間にはhasmanyのアソシエーションがあります。コントローラーで$datas = $this->Profile->find("all"); $this->set("datas",$datas);とすると、view側でProfileとImageのデータを表示する方法を知りたいです。
  • cakephpのアソシエーションについて学習中ですが、初心者のため分からない点があります。具体的には、[Profile]と[Image]というテーブルがあり、ProfileとImagesのアソシエーションがhasmanyです。コントローラーで$datas = $this->Profile->find("all"); $this->set("datas",$datas);としていますが、view側でProfileのデータとImageのデータを表示する方法を教えていただけませんか?
回答を見る
  • ベストアンサー

cakephpのアソシエーションについて

cakephp について勉強中です。 初心者なのでぜひ教えていただきたいのですが、 ・[Profile]と[Image]というテーブルがあり、ProfileについてImagesとのアソシエーションが  hasmanyなのですが、 コントローラーで  $datas = $this->Profile->find("all"); $this->set("datas",$datas); とした場合、view側でProfileのデータもImageのデータも表示されるにはどうしたらよいのでしょうか。 今は <?php foreach($datas as $data):?> <?php echo $data['Profile']['id']; ?> <?php echo $data['Image']['id']; ?> <?php endforeach; ?> とやっていますが、Imageテーブルのデータが出ません。 大変基本的なことだとは思いますがご指導いただければと思います。よろしくお願いします。

noname#151188
noname#151188
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

hasMany で取得されるデータ配列は、hasOneやbelongsTo とは異なります。 debug モードにして debug($datas) で表示してみられるとよいと思いますが以下の形式です array( [0] = array( [findしたmodel名] = array( /* 各カラム値 */   ),   [hasMany連携model名] = array(      [0] = array( /* 各カラム値 */      ),      [1] = array( /* 各カラム値 */      )   )  ), [1] = array( /* 2行目データ */ ) ) 現モデルの1行ごとに、hasMany連携先モデルの複数行データが入ってるので、$data['Image'][0]['id'] のようになります。 マニュアルも参照(とりあえず、1.3 用解説、ここら辺の動作はversionでの違いはない) http://book.cakephp.org/1.3/ja/view/1043/hasMany

noname#151188
質問者

お礼

丁寧で分かりやすい回答ありがとうございます!!きちんとデータが表示されました!!これからもがんばって勉強します。

関連するQ&A

  • CakePHPのアソシエーションがうまくいかず困っています。

    CakePHPのアソシエーションがうまくいかず困っています。 以下の3つのテーブルがあります。 [Table_A] id_a id_b name_a [Master_B] id_b name_b [Table_C] id_c id_a name_c Table_Aを中心にアソシエーションを設定しようと思い、modelを以下のように設定しました。 [Model A] class A extends AppModel { public $name = 'A'; public $useTable = 'Table_A'; public $primaryKey = 'id_a'; public $hasOne = array( 'C' => array('className' => 'C', 'foreignKey' => 'id_c' ) ); } [Model B] class B extends AppModel { public $name = 'B'; public $useTable = 'Table_B'; public $primaryKey = 'id_b'; } [Model C] class C extends AppModel { public $name = 'C'; public $useTable = 'Table_C'; public $primaryKey = 'id_c'; } そして、Controllerを以下のように設定しました。 [Controller A] $a = $this->A->find('all'); Controller Aでfindした結果、name_aとname_cの取得には成功しました。 そこでname_bも取得しようとしたのですが、どのようにアソシエーションを設定すればよいか、わかりません。 テーブルの項目は固定であり変更できないため、なんとかこれでアソシエーションを設定したいと思っています。 マニュアルやウェブサイトを調べたのですが、わかりませんでした。 ご教授のほどよろしくお願いいたします。

    • 締切済み
    • PHP
  • [CakePHP]複数テーブルのアソシエーション

    CakePHPについて質問です(Ver.2.2)複数テーブルのアソシエーションについてなのですが、下記のようなアソシエーションは可能でしょうか? [使用テーブル] Post、Recommend、UserMaster、UserDetail [結合キー] (1)Post.id = Recommend.post_id (2)User.id = Post.user_id (3)User.id = UserDetail.user_id つまり、Post.php内にてPost以外で紐づいているテーブル同士を結合が可能かどうかを知りたいです。((1)(2)はPostテーブルと紐づいているが、(3)はPostテーブル以外同士で紐づいている) 下記方法にて(1)(2)は実現できたのですが、(3)の方法が見つかりませんでした。 -- class Post extends AppModel { $belongsTo = array('User'); $hasOne = array('Recommend'); (略) -- 不明点あればご説明します。どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • cakePHPでアソシエーションが出来ない

    2つのモデル間でのhasMany-belongsTo のアソシエーションが出来ずに困っています。(cakephpのバージョンは2.4.4, php5.4,16, mysql 5.5.32) 2つのモデルは、コントローラーからそれぞれのindex()で表示できますが、外部キーで相手を指せていないようです。親からのfind('all')で、親の値しか変数に入ってきません。表記や考え方がおかしいのかもしれません。規約には沿っているつもりですので外部キーを入れないアソシエーションの指定(両モデルに対して)も試してみましたがダメでした。以下に、2つのテーブルとモデルを書きます。おかしいところを指摘して頂けると助かります。 ・GiiGestモデルにGiiPostモデルが多数ぶら下がっている構造です。(1:n) GiiGestモデル テーブル名:gii_gests  フィールド:id 主キー autoincrement ,neme varchar(128) ファイル名:gii_gest.php クラス名:GiiGest <?php class GiiGest extends AppModel{ // public $hasMany = 'GiiPost'; <- これだけでもダメでした。 public $hasMany = array( 'GiiPost' => array( 'className' => 'GiiPost', 'foreignKey' => 'gii_gest_id', <- ここいいのか疑問です? ) ); } GiiPostモデル テーブル名:gii_posts  フィールド:id 主キー autoincrement, gii_gest_id int not null ,comment varchar(255) ファイル名:gii_post.php クラス名:GiiPost <?php class GiiPost extends AppModel{ // public $belongsTo = 'GiiGest'; <- これだけでもダメでした。 public $belongsTo = array( 'GiiGest' => array( 'className' => 'GiiGest', 'foreignKey' => 'gii_gest_id' ) ); }

    • ベストアンサー
    • PHP
  • CakePHPでのコメント数表示について

    CakePHPを使って簡単な掲示板を開発しているのですが、トップページに 各トピックについたコメント数を表示させる方法で壁にぶち当たってしまっております。 データの取り出し方及び表示方法について教えて頂ければと思います。 DB構造(モデル)としては、 ==================================== ■掲示板(post.php) テーブル:posts id title contents ■コメント(comment.php) テーブル:comments id post_id comment ==================================== となっており、postsにhasMany、commentsにbelongsToで アソシエーションを貼ってあります。 コントローラー(posts_controller.php)では、 ==================================== $data = $this->Post->find('all',array('order' => array('Post.id' => 'desc'))); $this->set('data',$data); ==================================== という処理を行い、 ビュー(/posts/index.ctp)では、 ==================================== foreach($data as $val){ echo "<tr>"; echo "<td><a href='{$val['Post']['id']}'>$val['Post']['title']</a></td>"; echo "</tr>"; } ==================================== としています。 これで、トップページに行くと掲示板トピックスのタイトルの 一覧は表示できるのですが、その横についたコメント数を表示 させたいのです。 例)掲示板のタイトルです(13) 上記のように(○)とさせたいのです。 コントローラーの所でallではなくcountにすることで件数を取りだす ことができる所まではできるのですが、 $cnt = $this->Post->find('count',array('order' => array('Post.id' => 'desc'))); などとやっても本来取り出したいcommentsではなくpostsの件数を取りだす ことになってしまっています。 また、hasManyを利用すると、 Array( [0] => Array( [post] => Array( [id] => 1 [title] => 掲示板のタイトルです [contents] => 掲示板の内容です [comment] => Array( [0] => Array( [id] => 1 [post_id] => 1 [comment] => コメント1です。 [1] => Array( [id] => 2 [post_id] => 1 [comment] => コメント2です。 ・ ・ ・ となる為、ビューでの表示のさせ方にも困っております。

    • ベストアンサー
    • PHP
  • CakePHP 1.3について

    CakePHPが初心者です。 Views-userdetail-index.ctpにて <?php echo $form->create(null,array('type'=>'get','action'=>'./updateRecord')); ?> ~ <?php echo $form->textarea("User.remarks", array("cols" => 22,"rows" => 2)); ?> ~ を記述し、userdetail_controllerにて function updateRecord(){ if (!empty($this->data)){ $this->User->id = 1; $this->User->saveField('remarks','exists'); } else { $this->User->id = 1; $this->User->saveField('remarks','empty'); } $this->redirect('.'); } を記述しています。 しかし、どうしても「!empty($this->data)」の判別によってemptyとなってしまいます。 User.remarksの部分をUserdetailにして色々ためしましたが、どうしても値の受け渡しがうまくいかないのです。 どなたかご教授を宜しくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHP2について

    viewにデータを送るときに、1の $this->set() と2の $this->request->dataは、 どう違うのでしょうか? ご教授ください。 public function view($id = null) { // レコードを選択 $this->Post->id = $id; // レコードデータを取得しビューへ送る $this->set('post', $this->Post->read());---------1 } public function edit($id = null){ $this->Post->id = $id; if($this->request->is('get')) { $this->request->data = $this->Post->read();-------2 }

    • ベストアンサー
    • PHP
  • cakephpのビューの使い方

    cakephpのビューの使い方 windowsxp環境にxamppをインストール php:5.3.1 cakephp:1.2.6 書籍を読みながらcakephpを始めました。 フォームを利用するサンプルを試しています。 コントローラーで変数に値をセットし ビューでの変数の表示方法の記述がよくわかりません。 コントローラで $this->set("result",$result); とし ビューctpで <html> <body> <h1>送信結果</h1> <p><?=$result ?></p> </body> </html> と記述されているのですが、ブラウザには変数が表示されません。 <?php echo $result ?>と書けば表示されるのですが <?=$result ?>という書き方ですとなにも表示されません。 どなたかアドバイスをいただけると助かります。 作成日: 2010年4月2日(金) 21時05分

    • ベストアンサー
    • PHP
  • cakePHPのエラー

    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1 SQL Query: validateSearch Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp というエラーが出て困っています。 validateSearchの付近を確認してもよくわかりません。 searchpluginを使っているのですが、上手くいきません。 コントローラーは、 <?php App::uses('AppController', 'Controller'); class Mac554FoodDatasController extends AppController { public $name='Mac554FoodDatas'; public $components =array('Search.Prg'); public $presetVars=array(); public function beforeFilter() { //検索対象のフィールド設定代入 $this->presetVars = $this->Mac554FoodData->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function find() { $datas=$this->Mac554FoodData->find('all'); $this->set('datas',$datas); //検索条件設定 $this->Prg->commonProcess(); //検索条件取得 $tabe=$this->passedArgs; $conditions = $this->Mac554FoodData->parseCriteria['$tabe']; //ページャ関係 $this->paginate =array( 'conditions' => $conditions, 'limit' =>10 ); $this->set('Mac554FoodDatas',$this->paginate('Mac554FoodData')); // レイアウト関係 $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); // post時の処理 //$this->set('Mac554FoodDatas',$this->Mac554FoodData->find('all')); } public function index() { $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); //レイアウト } } ?> で、検索フォームはエレメントで <?php echo $this->Form->create('Mac554FoodData', array('url' => '/Mac554FoodDatas/find'))?> <fieldset> <legend>Search or Die!</legend> <dl> <dt><label>ユーザname</label></dt> <dd><?php echo $this->Form->input('name', array( 'type' => 'text', 'div' => false, 'label' => false))?></dd> <dt><label>time</label></dt> <dd><?php echo $this->Form->input('time', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> <dt><label>naiyoudao</label></dt> <dd><?php echo $this->Form->input('naiyoudao', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> </dl> <?php echo $this->Form->submit('検索',array('div'=>false,'escape'=>false))?> </fieldset> <?php echo $this->Form->end()?> のように作りました。 モデルは、 <?php class Mac554FoodDatas extends AppModel{ public $name=Mac554FoodData public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'name', 'type' => 'value', 'field' => 'Mac554FoodData.name'), array('name' => 'time', 'type' => 'like', 'field' => 'Mac554FoodData.time'), array('name' => 'naiyoudao', 'type' => 'like', 'field' => 'Mac554FoodData.naiyoudao'), ); //検索対象のフィールド設定 public $presetVars = array( array('field' => 'name', 'type' => 'value'), array('field' => 'time', 'type' => 'value'), array('field' => 'naiyoudao', 'type' => 'value'), ); } という感じで作りました。 投げているSQL文を見ると、 SELECT `Mac554FoodData`.`id`, `Mac554FoodData`.`time`, `Mac554FoodData`.`name`, `Mac554FoodData`.`naiyoudao`, `Mac554FoodData`.`twinoid` FROM `mac554_foodlog`.`mac554_food_datas` AS `Mac554FoodData` WHERE 1 = 1 となっています。 よろしくお願い致します

    • ベストアンサー
    • PHP
  • cakephpの質問2つ

    2つ質問させてください。 cakephpで、ホームページの左に項目を追加したいのですが (ホームページによくあるホームページ内リンク、ホームページ内の検索フォーム)、 layoutで指定できるのは、調べた限り、$title_for_layoutと$content_for_layoutだけでした。 当然、コントローラで取得した値は、メインの真ん中にしか、適応できず、左に適応させると、 今度はメインの真ん中の処理ができなくなってしまいます。 $content_for_layoutなどの変数(例:$sub_content_for_layout)を別個作る必要があるのでしょうか。また、そうであれば、 どのファイルに追記する必要がありますか。 コントローラで、ある変数を条件にfind()で1件だけレコードを取得して、そのデータをviewで使いたいのですが、 setした$dataの構造が確認できず、$arr['id']などの情報が取得できません。$data['テーブル名']としてviewに書くと、 すべてのカラムがAと表示され、うまくいきません。 controller: public function index(){ $cond = param['url']['name']; $data = $this->Table->find($cond); } view hoge.ctp: $arr = $data['Table']; foreach($data as $key){ echo $arr['id']; echo $arr['name']; echo $arr['phone']; } 以下、html~ 本やネットなどで調べましたが、当該情報が得られませんでした。お手数ですが、ご回答願えないでしょうか。

    • 締切済み
    • PHP
  • Cakephpでランキング機能の作成方法について。

    Cakephpでランキング機能の作成方法について。 Cakephpで、お気に入り数順のランキング機能を作りたいと考えています。 以下のような構造でランキングを表示させたいのですが、 やり方が分からず困っています。 ■システム概要 コーヒーの紹介サイトです。 様々なコーヒーが登録されており、ユーザーは任意のコーヒーをお気に入り登録できます。 Coffeeテーブル id , name Userテーブル id , name Favoriteテーブル id , coffee_id , user_id 現在、ランキングを表示させたいページであるindex.ctpには、$this->Coffee->find();でCoffeeの情報を表示させています。 アソシエーションでUserテーブル、Favoriteテーブルの情報も取れていますが、これをお気に入り数順にソートするやり方がわかりません。宜しくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう