使用DQL合并两个查询

时间:2019-04-07 18:38:44

标签: symfony doctrine-orm dql

我的主要实体poi与我的另外两个实体OneToOnepeople具有两个places关系。

App / Entity / People.php

class People
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Poi", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=false)
 */
private $poi;

App / Entity / Places.php

class Places
{
/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Poi", cascade={"persist", "remove"})
 */
private $poi;

现在,我需要将peopleplaces放在相同的数组或类似的数组中。我是通过合并两个查询得到的:

$query = $entityManager->createQuery('select p from App:People p'); //same for places then merge in array...

Q:是否可以通过一个DQL查询获得相同的结果? (特别是如果实体没有相同的列)。

1 个答案:

答案 0 :(得分:0)

要简单地将所有PeoplePlaces放在一个数组中,可以使用:

$query = $entityManager->createQuery('select people, places from App:People people, App:Places places');

我猜您将要为给定的Poi获取它们,在这种情况下,如果您只有poi ID,则可以尝试以下操作:

$query = $entityManager
    ->createQuery('select people, places from App:People people, App:Places places where people.poi = :poi and places.poi = :poi')
    ->setParameter('poi', $poiId)
;

自然地,如果您有一个Poi实体对象可供使用,则可以简单地

$peopleAndPlaces = [$poi->getPeople(), $poi->getPlaces()]

请注意,为了使上述代码正常工作,您必须将这些方法添加到相应的实体类中,并确保与Poi的关系为bidirectional

如果出于某种原因经常需要获取该数组并且您有一个Poi实体对象,则最好向Poi类添加一个方法

class Poi
{
    ...

    public function getPeopleAndPlaces()
    {
        return [$this->getPeople(), $this->getPlaces()];
    }

,然后在需要时致电$poi->getPeopleAndPlaces()