2010-09-07 12 views
0

Dans mon application CakePHP, j'ai un modèle appelé 'Client' qui décrit (sans surprise) un client individuel. J'ai ensuite un modèle 'Sale' sur une vente. (Un client par vente, beaucoup de ventes par client). Chaque vente a ensuite un 'car_id' (qui correspond au modèle 'Car') et un 'engine_id' (mappage vers 'Engine model'). Actuellement, quand je reçois les détails d'un client, il saisit les détails de chaque vente associée à ce client, mais je veux aller un peu plus loin et avoir, pour chaque vente, les détails de chaque voiture et de chaque moteur. Comment puis-je faire cela? Je comprends les relations entre les modèles, mais il me manque clairement quelque chose. Mon mise en place actuelle est comme ça ...CakePHP obtient des données de plusieurs modèles

Customer: $hasMany = 'Sales';

Sale: $hasOne = array('Car', 'Engine');

Il est évident que la « voiture » et « moteur » n'ont pas sale_id associé, car ils peuvent appartenir à beaucoup de différentes ventes.

Répondre

1

Vérifiez le comportement maîtrisable, il devrait vous permettre de faire tout ce dont vous avez besoin: http://book.cakephp.org/view/1323/Containable

Dans ce cas, une fois que vous activez maîtrisable sur vos modèles, vous pouvez faire quelque chose comme ceci:

$this->Customer->find('first', array(
    conditions -> array(
     'id' -> $customer_id), 
    contain -> array(
     'Sale' -> array(
      'Car', 'Engine')))); 

Vous pouvez également spécifier les champs et les conditions que vous souhaitez pour chaque modèle dans le conteneur.

+0

Votre code ne fonctionnera pas - vous devez joindre la vente, voitures, Moteur citations Je pense aussi que c'est principalement pour la récupération des données. –

+0

Merci, ajouté les citations, et aussi je n'ai pas eu assez de parenthèses fermantes. Comme j'ai compris la question, il s'agissait de la récupération de données. – bjudson

1

Si je comprends bien, votre relation est la suivante:

Customer -> Sale -> Car -> Engine 

linéaire, ce qui signifie voiture n'est pas associé au client que par la vente. Si cela est correct, il vous suffit de configurer vos relations dans chacun des modèles afin qu'ils soient correctement identifiés:

Customer hasMany Sale 
Sale belongsTo Customer 
Sale hasMany Car 
Car belongsTo Sale 
Car hasMany Engine 
Engine belongsTo Car 

Ensuite, lorsque vous interrogez la base de données, vous pouvez faire quelque chose comme:

$this->Customer->find('first', array(
    'conditions' => array('id' => $ID), 
    'recursive' => 1   // or 2 depending on your need 
) 
); 

Cela vous permettra d'explorer les données assez facilement.

En savoir plus ici: http://book.cakephp.org/view/73/Retrieving-Your-Data

+0

Juste un avertissement utilisant plus de 2 en récursif (même 2 est dangereux) pourrait conduire à la récursivité, c'est-à-dire que le client a de nombreuses ventes et ventes au client. La meilleure option consiste à utiliser le comportement Containable. –

0

Je pense que votre relation modèle (et cdburgess) est erroné. Il devrait ressembler à ceci:

Customer hasMany Sale 
Sale belongsTo Customer 
Car hasMany Sale 
Sale belongsTo Car 
Engine hasMany Sale 
Sale belongsTo Engine 

Ensuite, vous pouvez utiliser le comportement maîtrisable pour récupérer toutes les données relatives:

$this->Customer->Behaviors->attach('Containable'); 
$this->recursive = -1; 
$this->Customer->find('first', array(
    'conditions' => array('id' => $ID), 
    'contain' => array('Sale' => array('Car', 'Engine')) 
));