学说2:如何使用子查询列(在SELECT子句中)

Roc*_*t04 20 doctrine-orm

我正在尝试使用SELECT子句中的子查询执行简单的选择查询,并且根本没有找到方法来执行此操作.我已尝试使用DQL和QueryBuilder,但都不起作用.代码如下,请不要说我只能使用连接,这是一个简单的例子,只是为了说明问题,我有合理的子查询用例.

// With QueryBuilder
$query = $qb->select(array('a', 
                           '(SELECT at.addresstypeName 
                               FROM e:Addresstype at 
                              WHERE at.addresstypeId = a.addresstypeId
                            ) AS addresstypeName'))
            ->from('e:Address', 'a')
            ->where('a.addressId = :addressId')
            ->setParameter('addressId', 1);

// With DQL
$dql = "SELECT a, 
               (SELECT at.addresstypeName 
                  FROM e:Addresstype at 
                 WHERE at.addresstypeId = a.addresstypeId
               ) AS addresstypeName 
          FROM e:Address a 
         WHERE a.addressId = :addressId";
$query = $em->createQuery($dql)->setParameter(':addressId', 1);
Run Code Online (Sandbox Code Playgroud)

地址表中定义了以下关系:

/**
 * @ORM\ManyToOne(targetEntity="Addresstype")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="addresstype_id", referencedColumnName="addresstype_id")
 * })
 */
protected $addresstype;
Run Code Online (Sandbox Code Playgroud)

在本机SQL中,查询将如下所示:

SELECT
    a.*,
    (
        SELECT at.addresstype_name
        FROM addresstype at
        WHERE at.addresstype_id = a.addresstype_id
    ) AS addresstype_name
FROM address a
WHERE a.address_id = 1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Fli*_*lip 21

$query = $qb->select('a')
    ->addSelect('(SELECT at.addresstypeName
            FROM e:Addresstype at
            WHERE at.addresstypeId = a.addresstypeId) AS addresstypeName'
        )
    ->from('e:Address', 'a')
    ->where('a.addressId = :addressId')
    ->setParameter('addressId', 1);
Run Code Online (Sandbox Code Playgroud)


小智 11

对于我来说,带有doctrine的子查询适用于此查询:

$qb->select('e.field')
   ->addSelect('(SELECT count(mv.nm)
                FROM Clt\Bundle\MyBundle\Entity\MV mv
                LEFT JOIN Clt\Bundle\MyBundle\Entity\M ma WITH  mv.nm=ma.nm
                WHERE mv.ne=e.ne and ma.nm is null
                ) AS nm'
   )
   ->from($this->_entityName, 'e')
   ->leftJoin('e.m', 'm')
   ->where($qb->expr()->eq('t.id'.$typeModule, $idElementModule));
Run Code Online (Sandbox Code Playgroud)

请注意,在左连接中,您必须使用WITH而不是ON ...


Mic*_*eng 9

我知道这是一个老问题,但如果您愿意,您可以使用另一个查询生成器作为子查询:

 $qb->select("a")
            ->addSelect("(" . $qb2->select("at.addresstypeName")
                ->from("e:Addresstype", "at")
                ->where("at.addresstypeId = a.addresstypeId")
                ->getDQL() . ") AS addresstypeName"
            )
            ->from('e:Address', 'a')
            ->where('a.addressId = :addressId')
            ->setParameter('addressId', 1);
Run Code Online (Sandbox Code Playgroud)