LoginSignup
1
1

More than 5 years have passed since last update.

CakePHPでAPI(JSONで)続き。アソシエーションとの関係

Posted at

チーム(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 TeamModel/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"
            },
        }
    ]
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1