プレーン バニラ モデルでは、Cake のモデル リンクはモデルのrecursive
属性によって決まります。モデルの関係の例は次のようになります。
User
-> belongsTo Company
-> hasMany Department
-> hasMany Address
-> hasMany PhoneExtension
User hasMany PhoneExtension
(以下の説明を具体化するために、追加の関係 ( ) を追加しました。)
Model::recursive
には、-1、0、1、および 2 の3 つの許容値があります。各値は、モデル レコードを取得するための異なる深さを Cake の ORM に示します。$this->User->find('all')
違いを説明するために使用します。
ではrecursive = -1
、Cake は指定されたモデル (つまりUser
) のみを取得します。モデルの関連付けは解析されません。
で、Cake は指定されたモデルを取得し、その関連付けrecursive = 0
を解析します。すべてのレコードと、それぞれが属するレコードを取得します。belongsTo
$this->User->find('all')
User
Company
User
でrecursive = 1
、Cake は指定されたモデルを取得し、その直接的な関連付けをすべて解析します。は、すべてのレコード、それぞれが属するレコード、および に属する$this->User->find('all')
すべてのレコードを取得します。User
Company
User
PhoneExtension
User
で、Cake は指定されたモデルを取得し、その直接的な関連付けのすべてとrecursive = 2
その直接的な関連付けのすべての関連付けを解析します。は、モデル リレーションシップ ダイアグラムの例のすべてを取得します。つまり、すべてのレコード、レコードが属するレコード、 に属するすべてのレコード、およびに属するすべてのレコードとレコードです。$this->User->find('all')
User
Company
User
PhoneExtension
User
Department
Address
Company
これは、はい、質問で示した結果を達成できるという非常に長い言い方ですrecursive = 2
。
あなたが得るものよりも深く行きたい場合は、ビヘイビアーrecursive = 2
を使用する必要があります。モデルに追加の関連付けがあったとしましょう: . したがって:Containable
Department
hasMany Group
User
-> belongsTo Company
-> hasMany Department
-> hasMany Group
-> hasMany Address
-> hasMany PhoneExtension
recursive = 2
関連するすべてのレコードだけでなく、検索で取得したすべてのものを取得するには、次のように呼び出しをGroup
作成します。Model::find
$this->User->find('all', array(
'contain' => array(
'PhoneExtension',
'Company' => array(
'Department' => array( 'Group' ),
'Address'
)
)
));