2017-08-17 1 views
0

Ich versuche, eine Abfrage auszuführen, um alle Repos von einem bestimmten Organization zu erhalten, aber es gibt ein leeres Ergebnis zurück ... (Ich habe Daten in der DB!) Repos und Organisation sind eine Many to Many Beziehung.Symfony/Doctrine: Abfrage nach Kind Attribut

Hier ist das Repos Entity:

/** 
* Repos 
* 
* @ORM\Table(name="repos") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ReposRepository") 
*/ 
class Repos 
{ 

    ... 

    /** 
     * 
     * @ManyToMany(targetEntity="Organization", inversedBy="repos") 
     * 
     */ 
    protected $orgs; 

    ... 

Hier ist die Organization Entity:

/** 
    * Organization 
    * 
    * @ORM\Table(name="organization") 
    * @ORM\Entity(repositoryClass="AppBundle\Repository 
    * \organizationRepository") 
    */ 
    class Organization 
    { 
     ... 

     /** 
     * 
     * @ORM\ManyToMany(targetEntity="Repos", mappedBy="orgs") 
     * 
     */ 
     protected $repos; 

     ... 
    } 

Hier ist die Repository mit dem QueryBuilder:

/** 
* ReposRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 
class ReposRepository extends \Doctrine\ORM\EntityRepository 
{ 

    public function findReposByName($name){ 
     $qb = $this->createQueryBuilder('r'); 

     // Build query 
     $qb->select('r') 
      ->andWhere(
       ':searchName MEMBER OF r.orgs' 
      ); 
     $qb->setParameter('searchName',$name); 
     return $qb->getQuery()->getResult(); 
    } 

} 

Die $name ist der Name eines Or Ich möchte alle Repos mit demselben Organisationsnamen erhalten.

Antwort

2

Wenn Sie mit dem Attribut name Ihrer Organisation filtern möchten, müssen Sie eine Join-Abfrage durchführen.

Mit dem Query Builder

public function findReposByName($name){ 
    $qb = $this->createQueryBuilder('r'); 
    $qb->select('r') 
     ->join('r.orgs', 'o') 
     ->where('o.name = :searchName') 
     ->setParameter('searchName', $name); 
    return $qb->getQuery()->getResult(); 
} 

In DQL

public function findReposByName($name){ 
    $dql =<<<EOF 
     SELECT r 
     FROM AppBundle:Repos r 
     INNER JOIN r.orgs o 
     WHERE o.name = :searchName 
EOF; 
    return $this->_em 
       ->createQuery($dql) 
       ->setParameter('searchName',$name) 
       ->getResult(); 
} 
+0

Woww, es funktioniert !! Ich habe die Lösung vor einigen Tagen gesehen, aber ich habe den gleichen Join-Alias ​​wie der CreateQueryBuilder! Deshalb hat es nicht funktioniert! Vielen Dank! – HessianMad