2012-01-04 5 views
0

J'ai 4 tables:CakePHP - SQL: tables joindre

stores {id, name, owner_id, city_id, ...} 
store_managers {id, store_id, user_id, ...} // since I'm not associating (i have my reasons) the table to the others by cake's association, the name is not by the cakePHP naming conventions. 
cities {id, name, ...} 
users {id, name, ...} 

maintenant .. dans le stores_controller il y a une fonction appelée « stores_stats() » qui recueille des statistiques sur les magasins appartenant à l'utilisateur et spectacles il. Le owner_id provient de la $this->Auth->user('id')
Je veux utiliser un appel $this->Store->find('all') pour obtenir les informations suivantes:

  1. Le record du magasin lui-même.
  2. Les directeurs de magasin de chaque magasin.
  3. Enregistrement de la ville pour chaque magasin.
  4. L'enregistrement de magasin lui-même.

Le users et les cities tables sont associées à la table stores et une requête find('all') retourne correctement les données à leur sujet. mon problème est avec store_managers tableau.

Comment puis-je joindre le store_managers à la requête? Et, juste pour bien faire les choses - comment écrire moi-même une telle requête? La requête suivante me donne quelque chose .. .. autre

SELECT * 
FROM stores 
LEFT JOIN cities ON stores.id = cities.id 
LEFT JOIN store_managers ON store_managers.store_id = stores.id 
WHERE stores.id = 122 AND stores.owner_id = 3 

Répondre

1

Vous aurez probablement envie d'utiliser le comportement maîtrisable de CakePHP. (read more about it here).

//Store Model 
class Store extends AppModel { 

var $actsAs = array('Containable'); 

//associations 
//validation 

//the method you call from the controller 
function getStoreStats() { 
    $this->recursive = -1; 
    $params = array(); 
    $params['containable'] = array(
     'User' => array(
      'StoreManager', 
     ), 
     'City' 
    ); 
    $data = $this->find('all', $params); 
    return $data; 
} 
} 

L'idée est, vous définissez récursive à -1, ce qui limite les données que vous revenez de la boutique elle-même. Ensuite, en utilisant containable, vous spécifiez les autres données connexes que vous souhaitez renvoyer.

Assurez-vous que vous lisez le livre CakePHP pour vérifier que vous êtes sur la bonne version (1.3, 2.0 ... etc).

En outre, il est assez commun de simplement définir $this->recursive=-1; dans le modèle de l'application, c'est la valeur par défaut pour tous.

En supposant que toutes vos relations sont correctement configurées, et qu'aucune d'entre elles n'est une relation HABTM, Containable devrait vous convenir.

+0

merci, je suis d'accord. mais j'ai toujours besoin de la jointure et simple façon sql .. pouvez-vous s'il vous plaît aider? – yossi

+0

Vous essayez d'utiliser JOIN de Cake?Ou juste le faire fonctionner avec du SQL normal? – Dave

+0

Les deux - le sql normal sera suffisant – yossi

0

La solution à ce CakePHP mettrait en œuvre par rapport au modèle de magasins. S'il y a beaucoup de directeurs de magasin, vous pouvez mettre ce code dans le modèle Magasins:

$hasMany = array(
'StoreManagers' => array('className' => 'StoreManagers') 
); 

Ou s'il n'y a qu'un seul gestionnaire de magasin:

$hasOne = 'StoreManagers'; 

Si vous vous en tenez aux conventions de nommage, la découverte() call doit renvoyer array, où pour chaque Store doit être l'item 'StoreManagers' (ou array), où tous les éléments liés seront récupérés.

Pour en savoir plus sur le sujet des tables de jointure voir here

+0

Merci, mais comme je l'ai écrit - je ne veux pas associer les modèles. je veux ajouter une jointure d'ailleurs – yossi