チーム(teams テーブル)があって、それが複数のメンバー(members テーブル)と紐づいているようなケースを想定する。
アソシエーションが、Team hasMany Member
とした場合のJSONは、以下のようになる。
{
"data": [
{
"Team": {
"id": "1",
"name": "A Team"
},
"Member": [
{
"id": "1",
"team_id": "1",
"name": "Yamada"
},
{
"id": "2",
"team_id": "1",
"name": "Maeda"
}
]
},
{
"Team": {
"id": "2",
"name": "B Team"
},
"Member": [
{
"id": "3",
"team_id": "2",
"name": "Ishida"
},
]
}
]
}
Member belongsTo Team
をModel/Member.php
に追加しても同じ結果になる。
さらに以下のようにjoinsを使ってLEFT JOIN した場合は、
Controller/ApiController.php
$options['joins'] = array(
array(
'table' => 'members',
'alias' => 'Member',
'type' => 'LEFT',
'conditions' => array(
'Team.id = Member.team_id',
)
)
);
$options['fields'] = array('*');
$data = $this->Team->find('all', $options);
一行一行のデータになる。
{
"data": [
{
"Team": {
"id": "1",
"name": "A Team"
},
"Member": {
"id": "1",
"team_id": "1",
"name": "Yamada"
}
},
{
"Team": {
"id": "1",
"name": "A Team"
},
"Member": {
"id": "2",
"team_id": "1",
"name": "Maeda"
}
},
{
"Team": {
"id": "2",
"name": "B Team"
},
"Member": {
"id": "3",
"team_id": "2",
"name": "Ishida"
},
}
]
}
例えばここで、モデルTeam.phpに
Model/Team.php
public $virtualFields = array(
'member_name' => 'Member.name'
);
と記述すれば、同じモデル名にすることはできるが、入れ子にはならない。
{
"data": [
{
"Team": {
"id": "1",
"name": "A Team",
"member_name": "Yamada"
}
},
{
"Team": {
"id": "1",
"name": "A Team",
"member_name": "Maeda"
},
},
{
"Team": {
"id": "2",
"name": "B Team",
"member_name": "Ishida"
},
}
]
}