2011-06-22 6 views
3

Je tiens à m'excuser si je n'ai pas fait assez de recherche dans google mais pour être honnête, je ne sais pas exactement quoi rechercher. Mon problème est avec Doctrine. J'utilise Symfony et je veux écrire la requête suivante dans DQL premières:Gauche rejoindre dans Doctrine Query Language

SELECT c.id AS id, 
c.name AS name, 
c.active AS active, 
count(c2.id) AS depth, 
(c.rht - c.lft) as rng 
FROM (categories c 
LEFT JOIN categories c2 ON ((c2.lft < c.lft) AND (c2.rht > c.rht) AND c2.active)) 
GROUP by c.id 
ORDER by c.lft ASC 

Je peux écrire comme une requête brute, mais je dois en DQL que je veux l'utiliser pour un widget sfWidgetFormDoctrineChoice. Toute aide est grandement appréciée.

Merci d'avance!

+0

Doctrine 1.x ou 2.x? – borrible

+0

Désolé, j'ai oublié de le mentionner au début - 1.2 (comme je reste fidèle à Symfony 1.4) – fanjabi

Répondre

3

Une approuch possible serait:

$query = Doctrine_Query::create() 
    ->select('c.name AS name, 
      c.active AS active, 
      count(c2.id) AS depth, 
      (c.rht - c.lft) as rng') 
    ->from('categories c') 
    ->leftJoin('c.Categories c2 ON ((c2.lft < c.lft) AND (c2.rht > c.rht) AND c2.active') 
    ->groupBy('c.id') 
    ->orderBy('c.lft ASC'); 

Mais je pense que votre sur la mauvaise façon. Avez-vous vérifié le comportement de l'arbre de la doctrine? http://www.doctrine-project.org/documentation/manual/1_0/nl/hierarchical-data#nested-set:advanced-usage:fetching-a-tree-with-relations

+1

Merci pour la suggestion. Ce n'est pas la réponse à ma question - c'est beaucoup plus que ce que je voulais. Merci pour l'aide! P.S. J'ai réussi à le faire mais pour faire une jointure Doctrine nécessite une relation avec les colonnes locales et étrangères, j'ai donc créé une relation fictive pour pouvoir faire une jointure à gauche et ensuite remplacer la condition, car elle utilise par défaut local.foreign_id = relation foreign.id – fanjabi