CakePHP1.3.6:HABTMでデータを取得する
前回、前々回のログでは、HABTM(hasAndBetongsToMany)の関係にある2つのモデルに関してscaffoldを作ってみた。
今回は、このモデルからデータがどう得られるのか確認する。
コントローラーの作成とデータの取得結果
一覧表を作る目的で、$paginateに何が入ってくるか確認する。
<?php class ItemsController extends AppController{ public $name = 'Items'; /* * Paginatorの定義 */ public $paginate = array( 'page'=>1, 'conditions'=>array(), 'fields'=>array(), 'order'=>array('Item.timestamp'=>'desc'), 'limit'=>5, 'recursive'=>1 ); /** * * 初期画面(一覧表示) */ function index(){ $this->set('title_for_layout', "商品の一覧"); $data = $this->paginate(); print_r($data); $this->set('data',$data); } } ?>
この場合の結果は以下になる。
ItemとCategoryの2つのモデルを括るための配列(a)が用意され、Categoryの中は、ItemにhasManyで紐づいているカテゴリーが配列(b)で提供される。ついでに、紐づけに使われたCategoryItemまで連想配列(c)で取得される。ItemからみてCategoryは、Item->CategoryItem->Categoryと2階層目となっている。$paginateのrecursive=1としているが、この場合も、Categoryが取得されることがわかる。
Array ( [0] => Array ( .... (a) [Item] => Array ( [id] => 1 [name] => 商品1 [memo] => 商品1のメモ [timestamp] => 2030-01-01 00:00:00 ) [Category] => Array ( ... (b) [0] => Array ( [id] => 1 [name] => 食べ物 [memo] => 食べ物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( ... (c) [id] => 1 [item_id] => 1 [category_id] => 1 [timestamp] => 2010-12-14 21:16:42 ) ) [1] => Array ( [id] => 3 [name] => 飲食物 [memo] => 飲食物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 2 [item_id] => 1 [category_id] => 3 [timestamp] => 2010-12-14 21:16:42 ) ) ) ) [1] => Array ( [Item] => Array ( [id] => 2 [name] => 商品2 [memo] => 商品2のメモ [timestamp] => 2030-01-01 00:00:00 ) [Category] => Array ( [0] => Array ( [id] => 2 [name] => 飲み物 [memo] => 飲み物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 3 [item_id] => 2 [category_id] => 2 [timestamp] => 2010-12-14 21:17:00 ) ) [1] => Array ( [id] => 3 [name] => 飲食物 [memo] => 飲食物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 4 [item_id] => 2 [category_id] => 3 [timestamp] => 2010-12-14 21:17:00 ) ) ) ) )
コントローラーの作成とデータの取得結果(その2)
上の結果では、随分とたくさんのデータを拾ってしまう。
そこで、$paginateのオプションで、
'fields'=>array('Item.id','Item.name','Item.timestamp'),
を指定してみる。
この場合の取得結果は以下。この場合も、fieldsが適用されるのはItemモデルに関してのみ、となり、Category以下のデータがごっそりと取得されることがわかる。
Array ( [0] => Array ( [Item] => Array ( [id] => 1 [name] => 商品1 [timestamp] => 2030-01-01 00:00:00 ) [Category] => Array ( [0] => Array ( [id] => 1 [name] => 食べ物 [memo] => 食べ物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 1 [item_id] => 1 [category_id] => 1 [timestamp] => 2010-12-14 21:16:42 ) ) [1] => Array ( [id] => 3 [name] => 飲食物 [memo] => 飲食物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 2 [item_id] => 1 [category_id] => 3 [timestamp] => 2010-12-14 21:16:42 ) ) ) ) [1] => Array ( [Item] => Array ( [id] => 2 [name] => 商品2 [timestamp] => 2030-01-01 00:00:00 ) [Category] => Array ( [0] => Array ( [id] => 2 [name] => 飲み物 [memo] => 飲み物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 3 [item_id] => 2 [category_id] => 2 [timestamp] => 2010-12-14 21:17:00 ) ) [1] => Array ( [id] => 3 [name] => 飲食物 [memo] => 飲食物のメモ [timestamp] => 2030-01-01 00:00:00 [CategoryItem] => Array ( [id] => 4 [item_id] => 2 [category_id] => 3 [timestamp] => 2010-12-14 21:17:00 ) ) ) ) )
コントローラーの作成とデータの取得結果(その3)
これまで結果では、随分とたくさんのデータを拾ってしまう。
そこで、$paginateのオプションで、
'recursive'=>-1
を指定してみる。
この場合の取得結果は以下。ちゃんと、Itemだけ拾ってくるようになる。ちなみに、resursive=0でも同じ結果を得る。
Array ( [0] => Array ( [Item] => Array ( [id] => 1 [name] => 商品1 [timestamp] => 2030-01-01 00:00:00 ) ) [1] => Array ( [Item] => Array ( [id] => 2 [name] => 商品2 [timestamp] => 2030-01-01 00:00:00 ) ) )