在目录中,我有产品和文章。物品是产品的变体。在目录中,产品按类别分类,并且一个产品在目录中可以是一次或多次。
我想获取目录的文章,但是我的文章没有直接分配给目录,只有产品。
我想使用Doctrine的查询生成器构造以下SQL:
SELECT a.code, a.productCode, a.name
FROM Article a
INNER JOIN (
SELECT p.code
FROM Product p
WHERE p.catalogCode = 'MYCODE'
GROUP BY p.code
ORDER BY p.code ASC
) AS results ON results.productCode = a.productCode
该查询在MySQL中有效。我尝试在我的实体的存储库中执行此操作,但是出现错误:
public function findArticlesByCatalog($catatlogCode)
{
return $this->getEntityManager()
->createQuery(
'SELECT a.code, a.productCode, a.name
FROM AppBundle:Article a
INNER JOIN (
SELECT p.code
FROM AppBundle:CatalogProduct p
WHERE p.catalogCode = :code
GROUP BY p.code
ORDER BY p.code ASC
) AS results ON results.productCode = a.productCode'
)
->setParameter('code', $catatlogCode)
->getResult();
}
错误(在INNER JOIN之后):
[Semantical Error] line 0, col 81 near '(
SELECT': Error: Class '(' is not defined.
因此,我想在控制器中使用Doctrine的查询生成器来构造它。
我开始做某事,但我不知道要完成...
$repository = $em->getRepository('AppBundle:Article');
$qb = $repository->createQueryBuilder('a');
$qb->select(array('a.code', 'a.productCode', 'a.name'))
->innerJoin(
'AppBundle:CatalogProduct', 'p',
'WITH',
$qb->select('p.code')
->where(
$qb->expr()->eq('p.catalogCode', ':code')
)
->setParameter('code', $catCode)
->groupBy('p.code')
->orderBy('p.code', 'ASC')
)
// ...
如何指定其余查询?
AS results ON results.productCode = a.productCode'
谢谢你的帮助 !
我找到了正确的方法来做到这一点。
我重写了我的SQL,使其与第一个SQL相同,以便使用查询生成器轻松进行。
所以,我的第一个SQL:
SELECT a.code, a.productCode, a.name
FROM Article a
INNER JOIN (
SELECT p.code
FROM Product p
WHERE p.catalogCode = 'MYCODE'
GROUP BY p.code
ORDER BY p.code ASC
) AS cat_art ON cat_art.productCode = a.productCode
...具有与这一结果相同的结果:
SELECT DISTINCT a.code, a.productCode, a.name
FROM Article a
JOIN Product p ON a.productCode = p.code
WHERE p.code IN (
SELECT p.code
FROM Product p
WHERE p.catalogCode = 'MYCODE'
GROUP BY p.code
ORDER BY p.code ASC
)
使用查询构建器,我们应该使用2个不同的查询构建器编写2个查询:
# It is very important here to name it "p2", not "p" because,
# in the main query, there is already "p"
$qb2 = $em->getRepository('AppBundle:CatalogProduct')->createQueryBuilder('p2');
$subQuery = $qb2->select('p2.code')
->where(
$qb2->expr()->eq('p2.catalogCode', ':code')
)
->groupBy('p2.code')
->orderBy('p2.code', 'ASC');
# main query
$qb = $em->getRepository('AppBundle:Article')->createQueryBuilder('a');
$query = $qb->select(array('DISTINCT a.code', 'a.productCode', 'a.name', 'p.code AS productCode'))
->join('AppBundle:CatalogProduct', 'p', 'WITH', 'a.productCode = p.code')
->where(
$qb->expr()->in(
'p.code',
$subQuery->getDQL()
)
)
// Parameter used in subquery must be set in main query.
->setParameter('code', $catCode)
->getQuery();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句