DQL加入相关实体

时间:2017-09-18 17:26:22

标签: symfony 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;
    ...

我需要从每个“app \ ProyectosBundle \ Entity \ Proyectos”中获取“app \ SeccionesBundle \ Entity \ Secciones”类型的不同实体

我正在尝试查询:

$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 idea的数据??

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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定义,您可以将DQL编写为

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

上述查询将选择Secciones实体,并使用Subsecciones实体中定义的属性$subsecciones加入Secciones实体。

然后,查询将使用Subsecciones实体中定义的属性ProyectosSubsecciones$proyectosSubsecciones加入Subsecciones

最后,ProyectosSubsecciones Proyectos实体使用$proyecto实体中定义的ProyectosSubsecciones属性,最后它会根据您的WHERE子句应用过滤器。< / p>

  

请注意,不需要使用WITH子句来加入您的实体,因为在DQL中,加入部分将由您定义为OneToMany/ManyToOne or ManyToMany WITH的属性覆盖if实体之间没有定义关系映射,或者如果要在加入ON(a.id = b.some_id AND/WITH some = some)

等条件时添加其他过滤器