Jump to the content

【CakePHP】Modelのアソシエーション(関連付け)

PHP

    アソシエーションとは

    モデル同士のデータを関連させることで、1度の操作で複数のモデルからデータを取得したり、データを更新できる機能。

    アソシエーション(リレーションシップ)の種類

    モデルのプロパティとして設定する。

    NameDescriptionExample
    belongsToモデルが上位のモデルに所属する多対一の関係を定義public $belongsTo = array('User');
    hasManyモデルが下位のモデルを複数件所有する一対多の関係を定義public $hasMany = array('Task');
    hasOneモデルが下位のモデル1件所有する一対一の関係を定義public $hasOne = array('Profile');
    hasAndBelongsToManyモデルが中間のモデルを通じて複数のデータに所属する多対多の関係を定義するpublic $hasAndBelongsToMany = array('Member' => array('className' => 'Group'));

    belongsTo

    モデルが別のモデルのデータに所属しているという関係のアソシエーション。belongs to(所属)。
    例えば、ブログ記事のコメントやSNSなどのアカウントプロフィールなどデータが所有者のIDを保持しているようなデータ構造。

    belongsToの利用例

    <?php
    
    class Comment extends AppModel {
    
        public $belongsTo = array('Article');
    
    }
    

    アソシエーションが設定されたモデルを利用する

    <?php
    
    class CommentsController extends AppController {
    
        public function index() {
            $data = $this->Comment->find('all');
            debug($data);
        }
    
    }
    

    belongsTo - CakePHP Cookbook 2.x ドキュメント

    hasMany

    モデルが別のモデルにある複数のデータを所有しているという関係。belongsToとは逆の関係。
    belongsToが設定されている場合、逆側からはhasManyの関係が設定できる。 例えば、ブログ記事やSNSのアカウントなどデータ自身が所有者であるようなデータ構造。

    hasManyの利用例

    <?php
    
    class Article extends AppModel {
    
        public $hasMany = array('Comment');
    
    }
    

    hasMany - CakePHP Cookbook 2.x ドキュメント

    hasOne

    hasOneは、hasManyと同じくモデルが別のモデルのデータを所有するという関係のアソシエーション。 hasManyと違い対象のデータが必ず1件になる。

    hasOneの利用例

    <?php
    
    class Topic extends AppModel {
    
        public $hasMany = array('Comment');
    
    }
    

    hasOne - CakePHP Cookbook 2.x ドキュメント

    hasAndBelongsToMany

    多対多の関係でモデルとモデルを結びつけるアソシエーション。 1つの要素に対して複数のタグやカテゴリを割り当てるようなデータ構造に使われる。
    このデータ構造を使うには中間になるテーブルを作成して、テーブル名を2つのモデル名をアンダースコアでつないだ形にする。

    hasAndBelongsToManyの利用例

    <?php
    
    class Recipe extends AppModel {
    
        public $name = 'Recipe';
        public $hasAndBelongsToMany = array(
            'Ingredient' => array(
                'className' => 'Ingredient',
                'joinTable' => 'ingredients_recipes',
                'foreignKey' => 'recipe_id',
                'associationForeignKey' => 'ingredient_id',
                ...
            )
        )
    
    }
    

    hasAndBelongsToMany - CakePHP Cookbook 2.x ドキュメント

    各リレーションシップにはオプションを設定可能。各項目のCookbookを参照。

    注目記事

    最近の記事

    ぼくが書いてます

    フロントエンドエンジニア

    イソップ

    ページの先頭に戻る

    Search results

    ×