複数モデルを連携する (6/6)
作成:2010-02-20 20:46
更新:2010-05-10 20:40
更新:2010-05-10 20:40
■なぜモデルは連携できたのか?
ここまで、非常に簡単に2つのモデルを連携して表示することができました。ただ単に$hasOneなどの変数に、連携するモデル名を指定するだけで2つのモデルからまとめて関連するデータを取り出すことができました。
しかし、なぜ2つの関連がわかったのでしょうか。その秘密は「mydata_id」という項目の名前にあります。CakePHPでは、「モデル名_id」という名前で項目を用意しておくと、そのモデルと連携処理をするとき、自動的に指定した名前のモデルのIDと判断されるのです。
ここまで、$hasOneなどに値を設定するとき、ただモデル名を指定しましたが、これはもっと細かな情報を指定することもできます。たとえば、ここではContentdataに$hasManyを設定することでMydataの値までまとめて取り出すことができました。これは、もう少し詳しく書くと、下のリストのような書き方をすることができます。
ここで用意できる設定情報は他にもいろいろとあります。たとえば"order"で並び順を指定したり、"limit"で一度に取り出せるデータ数を指定するなど、関連するモデルからデータを取り出す方法を細かに指定できるのです。
とりあえず、これで2つのモデルを関連付けてまとめて取り出し扱う基本はわかりました。ここでは、ただprint_rで出力しているだけですが、もちろんテーブルなどで整形して使えば、2つの別々のモデルが連携していることなどほとんど気づかないくらい自然にデータを扱うことができるでしょう。
しかし、なぜ2つの関連がわかったのでしょうか。その秘密は「mydata_id」という項目の名前にあります。CakePHPでは、「モデル名_id」という名前で項目を用意しておくと、そのモデルと連携処理をするとき、自動的に指定した名前のモデルのIDと判断されるのです。
ここまで、$hasOneなどに値を設定するとき、ただモデル名を指定しましたが、これはもっと細かな情報を指定することもできます。たとえば、ここではContentdataに$hasManyを設定することでMydataの値までまとめて取り出すことができました。これは、もう少し詳しく書くと、下のリストのような書き方をすることができます。
$hasMany = array( モデル名 => array( 設定情報 ) );こんな具合に、関連付けをするモデル名の後に、必要な情報を連想配列としてまとめて渡すことで、細かな情報を用意することができるのです。下のリストでは、"className"と"foreignKey"という2つの情報を用意してあります。これは、それぞれ「モデルのクラス名」「外部キー(外部のモデルのIDが保管されている項目)名」を示すものです。これにより、Contentdataクラスのmydata_idの値が、このMydataのIDと同じものを取り出せばいいことがわかります。
ここで用意できる設定情報は他にもいろいろとあります。たとえば"order"で並び順を指定したり、"limit"で一度に取り出せるデータ数を指定するなど、関連するモデルからデータを取り出す方法を細かに指定できるのです。
とりあえず、これで2つのモデルを関連付けてまとめて取り出し扱う基本はわかりました。ここでは、ただprint_rで出力しているだけですが、もちろんテーブルなどで整形して使えば、2つの別々のモデルが連携していることなどほとんど気づかないくらい自然にデータを扱うことができるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※$hasManyの設定 public $hasMany = array( "Contentdata" => array( "className" => "Contentdata", "foreignKey" => "mydata_id" ) );
※関連コンテンツ
「初心者のためのCakePHP 1.3 プログラミング入門」に戻る