Doctrine2 Un-À-Plusieurs, relation d'Auto-référencement
Dans mon "Sujet" de l'entité, j'ai un Un-À-Plusieurs, relation d'Auto-référencement $parent:$children
.
class Topic
{
/** @ORM\Id
* @Column(type="integer")
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** @Column(length=40, unique=true) */
private $name;
/**
* @ORM\ManyToOne(targetEntity="Topic", inversedBy="children")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Topic", mappedBy="parent")
*/
private $children;
}
Je peux me joindre sur le tableau pour le parent-enfants hiérarchie comme ceci:
return $this->getEntityManager()->createQuery('
SELECT t, c FROM My\xxxBundle\Entity\Topic t
LEFT JOIN t.children c
WHERE t.parent IS NULL
')
->getArrayResult();
Voici le bon de sortie:
array
0 =>
array
'id' => int 1
'name' => string 'Parent 1'
'slug' => string 'p-1'
'description' => null
'children' =>
array
0 =>
array
'id' => int 2
'name' => string 'Child 1-1'
'slug' => string 'c-1-1'
'description' => null
1 =>
array
'id' => int 3
'name' => string 'Child 1-2'
'slug' => string 'c-1-2'
'description' => null
1 =>
array
'id' => int 4
'name' => string 'Parent 2'
'slug' => string 'p-2'
'description' => null
'children' =>
array
empty
...
mais si j'essaie d'aller chercher des colonnes spécifiques dans l'instruction SELECT:
SELECT t.name, c.name FROM My\xxxBundle\Entity\Topic t
- Je obtenir un tableau plat de l'enfant entités-je.e que c.name
. Si un parent n'a pas d'enfants, je viens d'obtenir une valeur null pour son nom:
1 =>
array (size=1)
'name' => string 'Child 1-1' (length=14)
2 =>
array (size=1)
'name' => string 'Child 1-2' (length=14)
3 =>
array (size=1)
'name' => null
4 =>
array (size=1)
'name' => string 'Child 3-1' (length=5)
Sur la Marque de la suggestion, j'ai renommé le champ nom de l'entité enfant:
SELECT t.name, c.name AS child_name FROM My\xxxBundle\Entity\Topic t
mais j'ai toujours le mauvais format:
array
0 =>
array
'name' => string 'Parent 1'
'child_name' => string 'Child 1-1'
1 =>
array
'name' => string 'Parent 1'
'child_name' => string 'Child 1-2'
2 =>
array
'name' => string 'Parent 2'
'child_name' => string 'Child 2-1'
OriginalL'auteur qais | 2012-09-24
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous sélectionnez deux champs portant le même nom (le nom de champ à partir de la rubrique et le champ nom de l'enfant). Ces noms de conflit les uns avec les autres lors de la création de la matrice de touches. La solution à ce problème est en renommant l'un des champs:
La raison pour laquelle vous obtenez un tableau plat, c'est parce que vous n'êtes pas sélectionner les entités, mais les valeurs de ces entités.
Voir pour plus d'informations le DQL de la documentation:
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#select-queries
Modifier
Le résultat que vous obtenez à partir de la requête est logique. Il correspond à ce que vous obtenez lorsque vous exécutez l'équivalent d'une requête SQL. Ce que vous faites actuellement est l'extraction de deux valeurs de deux tables de base de données. Ce que vous voulez vraiment sont deux partielle des entités formaté dans un tableau.
Ce que vous pouvez faire est d'essayer en utilisant Les partiels. C'est une façon, dans la doctrine de sélectionner quelques-uns des champs d'une entité. Vous combinez cela avec ->getArrayResult() que vous avez probablement obtenir le droit de sortie
Essayez partiels comme je le décris dans mon édité répondre
Il fonctionne maintenant. Merci Mark
OriginalL'auteur Mark