libro
www.tuyano.com
初心者のためのCakePHP 1.3 プログラミング入門

複数モデルを連携する (4/6)

作成:2010-02-20 17:57
更新:2010-05-10 20:37

■hasManyによる連携

このhasOneは、大変簡単に関連する別モデルのデータを取り出すことがわかりますが、しかし「取り出せるのは1つのみ」という点が問題です。今回の例で言えば、Content側には、MydataのあるIDに関連付けられたデータはいくつあるかわからないのです。ゼロかもしれないし、100個かも知れない。となると、hasOneでは、最初の1つだけしか取り出せませんからどうもうまくないですね。

こうした場合に用いられるのが「hasMay」です。これは文字通り、1つのデータに対し、別モデルの複数のモデルが対応できる、ということです。たとえば、MydataのあるIDのデータに、それと関連するContentdataの複数のデータがすべて取り出せるわけです。

では、「Mydata」のモデルクラスを、下のリストのように書き換えましょう。そして./mydataにアクセスしてみてください。データの構造が微妙に変化していることがわかるでしょう。取得される配列の各要素には、Mydataのオブジェクトと、Contentdataのオブジェクトの配列が用意されています。その配列の中に、関連するデータがすべて入っているのです。

ここでは、Mydataモデルクラス内にあった$hasOneを消し、代りに「$hasMany」というメンバー変数を用意しています。これが、hasManyによる連携を可能にするためのものです。これを記述しておくことで、Mydataのそれぞれのデータに、関連するContentdataがすべてまとめて取り出されるようになるのです。実に簡単ですね!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

class Mydata extends AppModel {
	
	public $name = "Mydata";
	public $hasOne = "Contentdata";

	public $validate = array(
		"name" => array(
			"rule" => 'notEmpty',
			"message" => "名前は必ず記入してください。"
		),
		"mail" => array(
			"rule" => 'email',
			"message" => "メールアドレスではありません。"
		),
		"comment" => array(
			"rule" => array("between",0,100),
			"message" => "メモは半角文字で100文字以内にしてください。"
		)
	);
	
	public $hasMany = "Contentdata"; // ★これ!
}

※関連コンテンツ

「初心者のためのCakePHP 1.3 プログラミング入門」に戻る