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

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

作成:2010-02-20 17:45
更新: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つずつ保管されていることがよくわかるでしょう。

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

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 プログラミング入門」に戻る