2017-09-18 121 views
1

您好有一些相關實體,需要定義一個dql查詢來獲取一個實體。DQL加入相關實體

MAIN ENTITY

class proyectosSubsecciones 
{ 
    ... 

    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="app\SubseccionesBundle\Entity\Subsecciones") 
    * @ORM\JoinColumn(name="id_subseccion", referencedColumnName="id") 
    */ 
    private $subseccion; 

    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="app\ProyectosBundle\Entity\Proyectos") 
    * @ORM\JoinColumn(name="id_proyecto", referencedColumnName="id") 
    */ 
    private $proyecto; 
    .... 

相關的實體

class subsecciones 
{ 
    ... 

    /** 
    * @ORM\ManyToOne(targetEntity="app\SeccionesBundle\Entity\Secciones") 
    * @ORM\JoinColumn(name="id_seccion", referencedColumnName="id",nullable=false) 
    */ 
    private $seccion; 
    ... 

我需要獲得類型的不同實體 「應用\ SeccionesBundle \實體\ Secciones」 從每個「應用\ ProyectosBundle \實體\ Proyectos「

我正在嘗試查詢:

$consulta=$em->createQuery(' 
      SELECT DISTINCT sc 
      FROM ProyectosSubseccionesBundle:ProyectosSubsecciones p 
      JOIN p.subseccion s WITH s.id=p.subseccion 
      JOIN s.seccion sc WITH sc.id=s.seccion 
      WHERE p.proyecto= :id 
     '); 
$consulta->setParameter('id', $id_proyecto); 
$subsecciones=$consulta->getResult(); 

我得到一個錯誤,指出:

「無法選擇通過標識變量實體而不選擇至少一根實體別名」

但我只需要從sc.Any想法的數據? ?

+0

如果需要從「SC」數據確實分擔PROYECTOS&Secciones –

+0

的定義 - 寫「SELECT DISTINCT SC」。爲什麼它是「SELECT DISTINCT ss」?什麼是「ss」? –

回答

1

使用查詢生成器在ProyectosSubseccionesRepository

return $this->createQueryBuilder('p') 
    ->join('p.subseccion', 's', Join::WITH, 's = p.subseccion') 
    ->join('s.seccion', 'sc', Join::WITH, 'sc = s.seccion') 
    ->where('p.proyecto = :id') 
    ->setParameter('id', $id) 
    ->getQuery() 
    ->execute() 
0

對於您的問題,我假定您已經定義了實體間的關係bidirectional

Entity      RelationType ReferenceEntity   Reference 
========================================================================================== 
ProyectosSubsecciones  ManyToOne  Subsecciones   $subseccion 
ProyectosSubsecciones  ManyToOne  Proyectos    $proyecto 
Proyectos     OneToMany  ProyectosSubsecciones $proyectosSubsecciones 
Subsecciones    OneToMany  ProyectosSubsecciones $proyectosSubsecciones 
Subsecciones    ManyToOne  Secciones    $seccion 
Secciones     OneToMany  Subsecciones   $subsecciones 

上述bidirectional定義考慮到你可以寫你的DQ​​L爲

SELECT DISTINCT s 
FROM Secciones s 
JOIN s.subsecciones ss 
JOIN ss.proyectosSubsecciones pss 
JOIN pss.proyecto 
WHERE p.id = :id 

上面的查詢將選擇Secciones實體和使用Secciones實體定義的屬性$subseccionesSubsecciones實體加盟。

然後查詢將加入SubseccionesProyectosSubsecciones使用屬性$proyectosSubseccionesSubsecciones實體中定義。

最後,它會用在ProyectosSubsecciones實體定義$proyecto財產Proyectos實體ProyectosSubsecciones,最後它會根據你的WHERE條款適用的過濾器。

注意有沒有必要使用WITH條款加入你的實體,因爲,在DQL,接合部將由您定義爲OneToMany/ManyToOne or ManyToManyWITH用於如果有實體或之間沒有定義關係映射屬性覆蓋如果要添加其他過濾器上加入標準像ON(a.id = b.some_id AND/WITH some = some)