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 ) ) 
	)