0

CakePHP を理解している人が、私が抱えていた質問に光を当ててくれることを願っていました。

これが私のシナリオです。私はUserthis Userhas aCompanyを持ち、これには manyDepartmentと manyがありAddressます。を取得した場合、およびそれに関連付けられているすべてのモデルにUserアクセスできると期待できますか?CompanyCompany

それで、可能でしょう$user['Company']['Department'][0]$user['Company']['Address'][0]

元の質問に戻りますが、モデル間の関連性はどの程度ですか?

4

3 に答える 3

4

プレーン バニラ モデルでは、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')UserCompanyUser

  • recursive = 1、Cake は指定されたモデルを取得し、その直接的な関連付けをすべて解析します。は、すべてのレコード、それぞれが属するレコード、および に属する$this->User->find('all')すべてのレコードを取得します。UserCompanyUserPhoneExtensionUser

  • で、Cake は指定されたモデルを取得し、その直接的な関連付けのすべてrecursive = 2その直接的な関連付けのすべての関連付けを解析します。は、モデル リレーションシップ ダイアグラムの例のすべてを取得します。つまり、すべてのレコード、レコードが属するレコード、 に属するすべてのレコード、およびに属するすべてのレコードとレコードです。$this->User->find('all')UserCompanyUserPhoneExtensionUserDepartmentAddressCompany

これは、はい、質問で示した結果を達成できるという非常に長い言い方ですrecursive = 2

あなたが得るものよりも深く行きたい場合は、ビヘイビアーrecursive = 2を使用する必要があります。モデルに追加の関連付けがあったとしましょう: . したがって:ContainableDepartmenthasMany 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'
        )
    )
));
于 2010-05-10T16:27:24.620 に答える
0

クラス/オブジェクトにアクセスして " $this->recursive = -1" を設定すると、依存関係のないオブジェクトのみが返されます!

于 2010-05-10T16:12:45.243 に答える
0

それはあなたが必要とする/したいのと同じくらい広範囲です。メソッドファミリーのrecursiveオプションを調べてください。find()また、Containable振る舞い。リストした特定の参照は可能ですが、ユーザーの直下にあります:

$user['Department'][0]

会社を通じて多くの部門を持つユーザーと考えてください。

于 2010-05-10T16:09:48.837 に答える