Объединить два запроса с DQL - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть основная сущность poi, которая имеет две OneToOne связи с двумя другими сущностями people и 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;

Теперь мне нужно получить people и places в одном массиве или что-то еще,Я получил это, объединив два запроса:

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

Q: Есть ли способ получить тот же результат с одним запросом DQL?(особенно если у сущностей нет одинаковых столбцов).

1 Ответ

0 голосов
/ 07 апреля 2019

Чтобы просто получить все People и Places в одном массиве, вы можете использовать:

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

Я думаю, вы захотите получить их для данного Poi, в этом случае, еслиу вас есть только идентификатор POI, который вы можете попробовать:

$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 являются двунаправленными

Если вам по какой-либо причине часто требуется получить этомассив, и у вас есть Poi объект сущности, возможно, было бы неплохо добавить метод к Poi классу

class Poi
{
    ...

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

и затем вызвать $poi->getPeopleAndPlaces() при необходимости.

...