CakePHPのアソシエーション機能を理解

*アソシエーションはモデル同士を繋ぐという役割を持っている。
CakePHPのもっともパワフルな機能の1つはモデル間の関連を

マッピングしてくれるモデルの機能でしょう。

アプリケーション中で、異なるオブジェクト同士の関連を定義することはよくあることです。

 

たとえばレシピのデータベースを例にとると、レシピはたくさんのレビューを持っていて、

そのレビューについては誰が書いたのかというユーザー情報を持っています。

そして、そのユーザーもまたレシピを持っているでしょう。

これらの関連を定義することで、直感的にデータにアクセスすることが出来ます。

コードのサンプル

リレーションシップの種別

CakePHPには4つのアソシエーションがあります。hasOne, hasMany, belongsTo, hasAndBelongsToMany(HABTM)です。

1 対 1 hasOne ユーザーは1つのプロフィールを持っている
1 対 多 hasMany ユーザーは複数のレシピを持っている
多 対 1 belongsTo レシピはユーザーに属している
多 対 多 hasAndBelongsToMany レシピは材料を持っており、かつ属している

アソシエーションは、アソシエーション名のクラス変数を生成することで定義されます。

クラス変数の内容は単純な文字列でもいいですし、アソシエーションを具体的に定義するため
に多次元の配列を使うこともできる。

上記の例では、配列の最初の’Recipe’は’エイリアス(別名)’です。
これはリレーションシップを識別するためのもので、どんな文字列でもかまいません。

普通は、そのリレーションシップが参照するクラスと同じ名前をつけますが、
各モデルのエイリアスはアプリケーション全体でユニークでなければなりません。

たとえば次の例を見てください。これは正しい書き方です。

しかし、以下の例はうまく動きません。

これはHABTMアソシエーションに、UserとGroupの両モデルを参照している’Member’というエイリアスがあるからです。
アプリケーション全体で、参照先が違うにもかかわらず同じエイリアスがあると、予期しない動作を引き起こす原因となります。

参照元ページ

☆ポイントレッスン☆
アソシエーションは’単方向’でしか定義できない。
User hasMany Recipeというアソシエーションを定義しても、それはRecipeモデルに対してはなにも影響しません。
RecipeモデルからUserモデルにアクセスするためには、Recipe belongsTo Userというアソシエーションを定義する必要があります。

 

アソシエーションとは、モデル感の関連をマッピングしてくれるモデル機能で、

この機能を通じてモデル間のつながりを操作する。

CakePHP Cookbookより引用

 

*規約*
http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html

*参考サイト*
https://teratail.com/questions/985

☆オススメ本☆

スポンサードリンク