「選手AはチームBに所属している」、「選手AはスタッツC、Dを持っている」という関連付けをしたい。
6.4. アソシエーション
そこで出てくるのがアソシエーションという操作です。
いまいち$belongsToと$hasOneの大きな違いが見出せずにいるのだけど、なんとなく$belongsToのほうが所属してるって感じがするじゃないですか?なので、そっちで試してみた。
前回すでに$belongsToを使ってPlayerはTeamと見事にくっついていたけれど、どうやらTeam側にも工夫が必要らしい。TeamにはPlayerがたくさん所属することになるので、$hasManyを使ってみました。Teamモデルに以下を追加。
var $hasMany = array(
'Player' => array(
'className' => 'Player',
'order' => '',
'foreignKey' => 'team_id',
'fields' => ''),
);
これで上手く連携が出来ている・・・はずです。
チームのビューを見ると・・・

でけたー!
Season0506のデータと選手を関連付け
選手とチームの関連付けが出来たところで、次に選手とデータを関連付けに入りたいと思います。
playersのテーブルにseason0506_idを追加します(MySQLの操作は省きますね)。次にseason0506sのテーブルを作成します。
DROP TABLE IF EXISTS season0506s;
CREATE TABLE season0506s (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pts VARCHAR(50),
reb VARCHAR(50),
ast VARCHAR(50),
);
INSERT INTO teams (pts,reb,ast) values ('307','206','24');
次に、Season0506のコントローラー、モデルを作成。URLに/season0506s/を書いてエンター。するとコントローラー、モデルを作れファッ○ンプログラマーが!!と指示を仰いでくださるので、言うとおりに作成。しかし、このままでは何にも関連付けされてません。idとptsなどが出てくるだけです。
次にplayerとseason0506のモデルに各々追加します。
playerモデル
var $hasOne = array(
'Season0506' => array(
'className' => 'Season0506',
'order' => '',
'foreignKey' => 'player_id',
'fields' => ''),
);
season0506モデル
var $belongsTo = array(
'Player' => array(
'className' => 'Player',
'dependent' => 'true',
'order' => '',
'foreignKey' => 'player_id',
'fields' => 'id,name'),
);
PlayerはSeason0506を持っている。Season0506はPlayerに所属している、という関連付けが出来たはず。dependentをtrueにしているのはKazuya HatanoのPlayerデータが削除された時、関連しているseason0506のデータも削除するということです。
結果
![]()
actionにある選手のviewをクリックしたら、こんな感じで表示されました。
これでアソシエーションはある程度覚えられたと思います。
$hasAndBelongsToManyはここでは省略(というか複雑すぎてわかりません)。それに今作ろうとしているものにはあまり必要ないかと思うので、省略させてもらいます。ブログやブクマ、スケジューリング、SNSを作りたい人には$hasAndBelongsToManyは覚えないといけないかもしれません。タグに必要な要素らしいので。
ひとつわかったのはPlayerモデルに$hasManyもしくは$belongsToといったアソシエーションを一度使用すると、同じものは使えないようです。ということはスタッツのデータベース部分は大きく見直さないといけないと思います。今はseason0506sというテーブルを使っているけど、statsに統一して全てのスタッツを入れ込んでいくことになるかと。
$hasManyでseason0506sとseason0607sのテーブルを選ぶことができたら便利だったのに~・・・でもないか。どっちにしても入れるデータ量は変わらないから、statsのテーブルにまとめられるし別にいっか(^^
hoopsstatsのほうはどれぐらい入れ込んでいるのか気になるなぁ・・・。一度で良いから見てみたい、という奴です。
次回は$scaffoldからの卒業とビュー部分のカスタマイズが出来たらいいな。



