複数モデルを連携する (4/6)
作成:2010-02-20 17:57
更新:2010-05-10 20:37
更新: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がすべてまとめて取り出されるようになるのです。実に簡単ですね!
こうした場合に用いられるのが「hasMay」です。これは文字通り、1つのデータに対し、別モデルの複数のモデルが対応できる、ということです。たとえば、MydataのあるIDのデータに、それと関連するContentdataの複数のデータがすべて取り出せるわけです。
では、「Mydata」のモデルクラスを、下のリストのように書き換えましょう。そして./mydataにアクセスしてみてください。データの構造が微妙に変化していることがわかるでしょう。取得される配列の各要素には、Mydataのオブジェクトと、Contentdataのオブジェクトの配列が用意されています。その配列の中に、関連するデータがすべて入っているのです。
ここでは、Mydataモデルクラス内にあった$hasOneを消し、代りに「$hasMany」というメンバー変数を用意しています。これが、hasManyによる連携を可能にするためのものです。これを記述しておくことで、Mydataのそれぞれのデータに、関連するContentdataがすべてまとめて取り出されるようになるのです。実に簡単ですね!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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 プログラミング入門」に戻る