【问题标题】:Merge two queries with DQL使用 DQL 合并两个查询
【发布时间】:2019-04-07 18:38:43
【问题描述】:

我的主要实体 poi 与我的其他两个实体 peopleplaces 有两个 OneToOne 关系。

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...

问:有没有办法用一个 DQL 查询获得相同的结果? (特别是如果实体没有相同的列)。

【问题讨论】:

    标签: symfony doctrine-orm dql


    【解决方案1】:

    要简单地将所有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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2012-09-02
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多