2011-11-08 3 views
0

je les tables de base de données suivantes:CakePHP Comportement Containable ne fonctionne pas comme prévu

products 
******** 
id 
title 
artist_id 

artists 
******* 
id 
profile 
rating 
person_id 

people 
****** 
id 
full_name 

Avec les associations de modèles suivants:

Product Model 
************* 
public $belongsTo = array(
    'Artist' => array(
     'className' => 'Artist' 
     'foreignKey' => 'artist_id' 
    ) 
); 

Artist Model 
************ 
public $belongsTo = array(
    'Person' => array(
     'className' => 'Person' 
     'foreignKey' => 'person_id' 
    ) 
); 
public $hasMany = array(
    'Product' => array(
     'className' => 'Product' 
     'foreignKey' => 'product_id' 
    ) 
); 

Person Model 
************ 
public $hasOne = array(
    'Artist' => array(
     'className' => 'Artist' 
     'foreignKey' => 'person_id' 
    ) 
); 

J'ai mis chacun des trois modèles à utiliser le comportement maîtrisable en utilisant:

public $actsAs = array('Containable'); 

Lorsque j'utilise ce qui suit pour obtenir les détails du produit avec l'art Nom ist:

$this->Product->find('first', array('conditions' => array('Product.id' => $id), 'contain' => 'Person.full_name')) 

je reçois l'avertissement:

Model "Product" is not associated with model "Person" 

Et je reçois seulement les détails du produit à savoir le nom de l'artiste pas. Pourquoi cela arrive-t-il?

Répondre

2

Cela se produit parce que vous appelez l'opération find sur le modèle Product et Person n'est pas directement lié àProduct, mais indirectement, par sa relation à Artist. Dans ce cas, votre tableau contain devrait être quelque chose comme ce qui suit:

$this->Product->find('first', array(
    'conditions' => array('Product.id' => $id), 
    'contain' => array('Artist' => 'Person.full_name') 
)); 

Cela renverra un résultat comme

array(
    [Product] => array(...), 
    [Artist] => array(
     [Person] => array(
      'full_name' => '...' 
     ) 
    ) 
) 
Questions connexes