2016-07-12 23 views
1

私はCakePHP 2.xのドキュメントと混同していますModel Associationここでは、接続して結果に含まれるものを見つけるのに少し助けが必要です。 enter image description hereCakePHP複数モデルの関連付け

Deal Table > id | title 
DealAttribute Table (has options) > id | title 
DealAttributeOption Table (belongs to DealAttribute) > id | title | deal_attribute_id 
DealsDealAttributes Table > id | deal_id | deal_attribute_id | option_id 

Deal [ 
    id, title 
    DealsDealAttributes [ 
     id, deal_id, deal_attribute_id, option_id 
     DealAttribute [ 
      title 
     ] 
     DealAttributeOption [ 
      title 
     ] 
    ] 
] 

のような結果が必要私はすべての3つのDeal, DealAttribute, DealAttributeOptionDealsDealAttributes$hasAndBelongsToMany$belongsToともしてみましたが、含まれている取得できませんでした。 今私はすべての関連するモデルが含まれて来る取引を見つける場合。モデルの関連付けを設定するにはどうすればよいですか?

+0

あなたはに$ hasManyのと$ belongsToの両方の関係を定義していますそれぞれのモデル?それとも混乱していますか?あなたがテーブルを作ることについてcakephp規約に従えば、ケーキベークとのモデルリレーションを追加することができます。 –

+0

これまでに試したことをあなたの既存のコードで見ることは役に立ちます。基本的に、外部キーを含むテーブルのモデルは 'belongsTo'関係を持ちますが、外部キーを含む別のテーブルに関連付けられているモデルは' hasOne'または 'hasMany'関係になります。 – drmonkeyninja

+0

@drmonkeyninja私は多くの方法を試してみましたが、誰もうまくいきませんので、混乱しています。 – Anupal

答えて

0

モデルの団体がこのような何かを設定する必要があるように見えます: -

class Deal extends AppModel { 

    public $belongsTo = [ 
     'User' 
    ]; 

    public $hasMany = [ 
     'DealsDealAttribute' 
    ]; 

} 

class DealsDealAttribute extends AppModel { 

    public $belongsTo = [ 
     'Deal', 
     'DealAttribute', 
     'DealAttributeOption' => [ 
      // Foreign key breaks naming convention so needs setting manually 
      'foreignKey' => 'option_id' 
     ] 
    ]; 

} 

class DealAttribute extends AppModel { 

    public $belongsTo = [ 
     'User' 
    ]; 

    public $hasMany = [ 
     'DealsDealAttribute' 
    ]; 

} 

class DealAttributeOption extends AppModel { 

    public $hasMany = [ 
     'DealsDealAttribute' 
    ]; 

} 

あなたはCakePHPの命名から壊れてきたようにDealsDealAttributeモデルにDealAttributeOption協会の外部キーを設定する必要があります(理想的にはdeal_attribute_option_idでなければなりません)。そして、あなたはこのような関連するモデルを取得するためにcontainを使用することができます関連レコードと契約を取得するために

更新

: -

$result = $this->Deal->find('first', [ 
    'contain' => [ 
     'DealsDealAttribute' => [ 
      'DealAttribute', 
      'DealAttributeOption' 
     ] 
    ], 
    'conditions' => [ 
     'Deal.id' => $id 
    ] 
]); 
+0

私は同じことをしましたが、私が取引を見つけると、 'DealsDealAttribute'は関連付けられていません。 – Anupal

+0

データを取得するために何をしていますか?あなたの検索クエリが間違っているようですね! – drmonkeyninja

+0

'$ result = $ this-> Deal-> findById($ id);'これはコントローラで取引を見つける方法です。 – Anupal

関連する問題