複数モデルを連携する (3/6)
作成:2010-02-20 17:45
更新:2010-05-10 20:36
更新:2010-05-10 20:36
■hasOneによる連携
では、この2つのモデルの関連を制しておきましょう。2つのモデルには、以下のような形で関連するデータが用意されています。
Mydata――特に何も用意されていない。
Contentdata――「mydata_id」という項目に、関連するMydataのIDが保管してある。
この関連の状態をよく頭に入れてください。「Mydata ← Contentdata」という関連付けが用意されているだけです。その逆はありません。
では、関連付けを行ってみましょう。CakePHPには何種類かの関連付け機能があります。まずは「hasOne」というものからです。hasOneは、「あるモデルのデータに、関連する別のモデルのデータが1つだけある」という形です。ここでは「Mydataに、関連するContentdataが1つある」という形になります。注意したいのは、「関連するデータである側にのみ、関連情報がある」という点です。つまり、「Mydata側には、関連するContentdataの情報は保管されていない」ということです。
では、まずMydataのモデルクラスに修正を行います。Mydataクラスに、「public $hasOne = "Contentdata";」というメンバー変数を追記してください。これが、hasOneを利用するための設定です。$hasOneに、hasOneでデータを引っ張ってくるモデル名を指定します。必要な設定は、わずかにこれだけです。
では、取得したデータがどうなるかよくわかるように、MydatasControllerクラスの「index」メソッドと、「view」「mydatas」内の「index.ctp」テンプレートをそれぞれ下に掲載したように書き換えましょう。
mydataにアクセスすると、各Mydataのデータ1つと、それに関連するContentdataのデータ1つが、セットになって取り出されることがわかります。これが、hasOneによって実現される関連付けの機能です。
hasOneは、このようにmydata_idの値を元に、Mydataのデータと、それに関連付けられているContentdataのデータを、それぞれ1つずつセットで取り出します。取得したデータの配列の中に、MydataとContentdataのデータが1つずつ保管されていることがよくわかるでしょう。
Mydata――特に何も用意されていない。
Contentdata――「mydata_id」という項目に、関連するMydataのIDが保管してある。
この関連の状態をよく頭に入れてください。「Mydata ← Contentdata」という関連付けが用意されているだけです。その逆はありません。
では、関連付けを行ってみましょう。CakePHPには何種類かの関連付け機能があります。まずは「hasOne」というものからです。hasOneは、「あるモデルのデータに、関連する別のモデルのデータが1つだけある」という形です。ここでは「Mydataに、関連するContentdataが1つある」という形になります。注意したいのは、「関連するデータである側にのみ、関連情報がある」という点です。つまり、「Mydata側には、関連するContentdataの情報は保管されていない」ということです。
では、まずMydataのモデルクラスに修正を行います。Mydataクラスに、「public $hasOne = "Contentdata";」というメンバー変数を追記してください。これが、hasOneを利用するための設定です。$hasOneに、hasOneでデータを引っ張ってくるモデル名を指定します。必要な設定は、わずかにこれだけです。
では、取得したデータがどうなるかよくわかるように、MydatasControllerクラスの「index」メソッドと、「view」「mydatas」内の「index.ctp」テンプレートをそれぞれ下に掲載したように書き換えましょう。
mydataにアクセスすると、各Mydataのデータ1つと、それに関連するContentdataのデータ1つが、セットになって取り出されることがわかります。これが、hasOneによって実現される関連付けの機能です。
hasOneは、このようにmydata_idの値を元に、Mydataのデータと、それに関連付けられているContentdataのデータを、それぞれ1つずつセットで取り出します。取得したデータの配列の中に、MydataとContentdataのデータが1つずつ保管されていることがよくわかるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※Mydataクラスに追加するメンバー変数 public $hasOne = "Contentdata"; ※MydatasControllerクラスのindexメソッドの修正 function index(){ $this->set("page_title","Sample Page"); $this->set("content_header","Sample Page."); $this->set("content_footer","copyright SYODA-Tuyano. 2010."); $datas = $this->Mydata->find("all"); $this->set("datas",$datas); } ※「views」「mydatas」内の「index.ctp」の修正 <h1>データの一覧リスト</h1> <pre> <?PHP print_r($datas); ?> </pre>
※関連コンテンツ
「初心者のためのCakePHP 1.3 プログラミング入門」に戻る