我正在尝试使用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 ...
我知道这是一个老问题,但如果您愿意,您可以使用另一个查询生成器作为子查询:
$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)
| 归档时间: |
|
| 查看次数: |
42708 次 |
| 最近记录: |