20second timeout

2008年2 月26日

アソシエーションでデータの関連付け(CakePHPの修行#3)

Posted by: Shu-K In: ぷろぐらむ

「選手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' => ''),
);

これで上手く連携が出来ている・・・はずです。

チームのビューを見ると・・・
team_model.jpg
でけたー!

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のデータも削除するということです。

結果

belong_view_player.jpg
actionにある選手のviewをクリックしたら、こんな感じで表示されました。

これでアソシエーションはある程度覚えられたと思います。

$hasAndBelongsToManyはここでは省略(というか複雑すぎてわかりません)。それに今作ろうとしているものにはあまり必要ないかと思うので、省略させてもらいます。ブログやブクマ、スケジューリング、SNSを作りたい人には$hasAndBelongsToManyは覚えないといけないかもしれません。タグに必要な要素らしいので。

ひとつわかったのはPlayerモデルに$hasManyもしくは$belongsToといったアソシエーションを一度使用すると、同じものは使えないようです。ということはスタッツのデータベース部分は大きく見直さないといけないと思います。今はseason0506sというテーブルを使っているけど、statsに統一して全てのスタッツを入れ込んでいくことになるかと。

$hasManyでseason0506sとseason0607sのテーブルを選ぶことができたら便利だったのに~・・・でもないか。どっちにしても入れるデータ量は変わらないから、statsのテーブルにまとめられるし別にいっか(^^
hoopsstatsのほうはどれぐらい入れ込んでいるのか気になるなぁ・・・。一度で良いから見てみたい、という奴です。

次回は$scaffoldからの卒業とビュー部分のカスタマイズが出来たらいいな。

No Responses to "アソシエーションでデータの関連付け(CakePHPの修行#3)"

コメントフォーム

Flickr PhotoStream

  • 15471491_1
  • 15487407_1
  • 15490146_1
  • 14288983_1

About

そっとお休みを取るブログ。20秒だけのお休み。あぁ、まったりペース。