Essayer de faire une requête assez simple dans Propel 2. J'ai une table Person et une table Possession - les personnes peuvent avoir beaucoup de possessions mais seulement un de chaque type de possession. Donc, une personne peut avoir 1 livre, 1 voiture, etc. J'essaie d'écrire une requête dans Propel qui rendra toutes les personnes avec leur nom de voiture à condition qu'ils aient une voiture. Voici le code et la requête résultante:Propel ajoute CROSS JOIN pour interroger lors de l'utilisation d'un alias pour JOIN tables
$x = PersonQuery::create()
->groupById()
->leftJoinPossession()
->addJoinCondition('Possession','Possession.possession_type = ?', 'car')
->withColumn('Possession.possession_name', 'CarName')
->where('Possession.possession_name IS NOT NULL')
->find()
->toString();
//resulting sql
SELECT person.id, possession.possession_name as CarName
FROM person
LEFT JOIN possession ON (person.id=possession.person_id AND possession.possession_type = 'car')
WHERE possession.possession_name IS NOT NULL;
Cela fonctionne comme prévu. Cependant, j'ai besoin de faire plusieurs jointures à la table de possession (obtenir les livres pour chaque personne par exemple) donc j'ai besoin d'utiliser un alias. Voici ce qui se passe quand je modifie la requête précédente juste pour utiliser un alias pour la table de possession (et pour obtenir aussi le livre pour chaque personne):
$x = PersonQuery::create()
->groupById()
->leftJoinPossession('p')
->addJoinCondition('p','p.possession_type = ?', 'car')
->leftJoinPossession('p2')
->addJoinCondition('p2','p2.possession_type = ?', 'book')
->withColumn('p.possession_name', 'CarName')
->withColumn('p2.possession_name', 'BookName')
->where('p.possession_name IS NOT NULL')
->find()
->toString();
//resulting sql
SELECT person.id, p.possession_name as CarName, p2.possession_name as BookName
FROM person
CROSS JOIN possession
LEFT JOIN possession p ON (person.id=p.person_id AND p.possession_type = 'car')
LEFT JOIN possession p2 ON (person.id=p2.person_id AND p2.possession_type = 'book')
WHERE p.possession_name IS NOT NULL;
Comme vous pouvez le voir, pour une raison quelconque Propel ajoute: « CROSS JOIN possession "à la requête. Cela ne change pas le résultat de la requête mais la rend extrêmement lente. Des idées sur comment je peux dire Propel de ne pas utiliser un CROSS JOIN tout en utilisant un alias pour ma table jointe? (Le CROSS JOIN disparaît aussi si je retire la clause 'where')
Je dois pouvoir utiliser plusieurs jointures à la table de possession. J'ai édité le deuxième bloc de code dans mon post original pour montrer ce que je dois faire un peu plus clair - je ne pense pas que la construction de la requête à votre façon fonctionnera pour ce que j'essaie de faire. – zeke
Je ne vois pas pourquoi ce ne serait pas le cas. Comme je l'ai dit, vous pouvez spécifier un alias pour usePossessionQuery (c'est le premier paramètre). Je vais mettre à jour mon message avec un exemple de plusieurs jointures. – chocochaos