2010-10-21 6 views
3

J'ai une relation many-2-many entre Property et Feature. Je dois extraire des résultats de la table de propriété, mais seulement si les deux ou plusieurs dispositifs sont liés.Doctrine: problème complexe JOIN

Ie. La propriété n ° 1 est liée à 'Piscine' et 'Jardin'. La propriété n ° 2 est liée uniquement à 'Piscine'. Donc, quand je demande des propriétés qui a à la fois 'Piscine' et 'Jardin', il devrait me renvoyer seulement la propriété n ° 1.

J'ai essayé TOUTES les combinaisons possibles comme complexe 'where()', 'whereIn', 'joindre ... avec', 'exists()' etc. mais ne peut pas le résoudre. Il me renvoie toutes les propriétés ou aucune, je ne me souviens pas vraiment de toutes les choses que j'ai essayées. S'il vous plaît, aide, j'ai gaspillé 8 heures et il me tue

Répondre

2

Donc, en d'autres termes, vous voulez sélectionner toutes les propriétés qui sont liées à plusieurs caractéristiques spécifiques.

Essayez:

function findPropertyForFeatures($features) 
{ 
    $q = Doctrine_Query::create()->from('Property p'); 
    $i = 0; 
    foreach ($features as $f) 
    { 
     $i++; 
     $q->innerJoin("p.Feature f$i WITH f$i.id = {$f->id}"); 
    } 
    return $q->execute(); 
} 

Caractéristiques est censé être un Doctrine_Collection avec les fonctionnalités que vous souhaitez joindre à. Remplacez $f->id par $f['id'] pour prendre en charge un tableau Doctrine ou avec $f si vous souhaitez fournir un tableau simple rempli d'ID de fonction.

+0

Merci, j'ai essayé mais ça m'inquiète un peu; le SQL généré est assez intensif: FROM propriété p INNER JOIN propriété_fonction p2 ON (p.id = p2.property_id) INNER JOIN entité_attraction f ON f.id = p2.feature_id AND (f.name =?) AND f .type = 1 SELECT ... raccourci .... INNER JOIN propriété_fonction p3 ON (p.id = p3.property_id) INNER JOIN entité_attraction_fonction f2 ON f2.id = p3.feature_id AND (f2.name =?) ET f2.type = 1 – Zeljko

+0

Comme vous pouvez le voir, property_feature est joint à 'feature_attraction_entity' 2 fois lorsque j'essaie de rechercher 2 fonctions. Peut-il être éliminé d'une manière ou d'une autre? Je travaille avec Doctrine depuis presque un an, mais la différence entre leftjoin et innerjoin me trouble. – Zeljko

+1

Non. Eh bien, vous pourriez probablement faire des sous-requêtes. Notez que ce 'problème' n'est pas un problème de Doctrine, il n'y a tout simplement pas de moyen plus simple de le faire en SQL sans rejoindre la même table deux fois. Cela dit, si vous vous assurez que vous avez des index sur vos clés étrangères (et des contraintes FK si nécessaire) dans votre base de données, ce n'est vraiment pas une requête intensive. –