Symfony3 / Doctrine2:使用QueryBuilder与InnerJoin进行子查询

前夕

在目录中,我有产品和文章。物品是产品的变体。在目录中,产品按类别分类,并且一个产品在目录中可以是一次或多次。

我想获取目录的文章,但是我的文章没有直接分配给目录,只有产品。

我想使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用QueryBuilder的Symfony2 / Doctrine2 innerJoin

来自分类Dev

Symfony3 QueryBuilder orderBy 实体字段

来自分类Dev

如何使用symfony3,doctrine2和stofDoctrineExtensionsBundle获取Gedmo Tree元素的路径

来自分类Dev

用PhpStorm进行Symfony3调试

来自分类Dev

用PhpStorm进行Symfony3调试

来自分类Dev

使用Symfony3的API REST的结构

来自分类Dev

在symfony3中使用ckeditor

来自分类Dev

在symfony3中使用ckeditor

来自分类Dev

Symfony3,Doctrine2,自定义夹具加载器

来自分类Dev

Symfony3 Doctrine2无法在循环中访问变量

来自分类Dev

Symfony3 Doctrine2无法在循环中访问变量

来自分类Dev

Symfony3 querybuilder orderby count many manytomany

来自分类Dev

Symfony3 queryBuilder 如何使用 OR 进行搜索以及如何搜索子字符串?

来自分类Dev

从 Doctrine 实体 (Symfony3) 中获取所有值

来自分类Dev

symfony3教义2关联计数器字段

来自分类Dev

在使用symfony3的树枝中,“ {%use%}”如何工作?

来自分类Dev

Symfony3使用多个AppKernel.php

来自分类Dev

在使用symfony3的树枝中,“ {%use%}”如何工作?

来自分类Dev

使用LiipImagineBundle和Symfony3找不到图像

来自分类Dev

Symfony3 使用 phpunit 测试 redirectToRoute() 方法

来自分类Dev

Symfony3 不使用 FormBuilder 上传文件

来自分类Dev

在symfony3中使用原则进行右联接查询

来自分类Dev

在symfony3中使用原则进行右联接查询

来自分类Dev

Symfony2-> Symfony3目录结构更改背后的逻辑是什么?

来自分类Dev

Symfony3、Doctrine 2 和 Sonata Admin Bundle 的图像上传问题

来自分类Dev

Symfony3,缺少Doctrine \ ORM \ EntityRepository :: __ construct()的参数1,如何以及为什么

来自分类Dev

使用Swagger2和Symfony3检索POST参数

来自分类Dev

Symfony3对于AppBundle \ Entity \的查询缺少标识符ID

来自分类Dev

如何在Symfony3中使用分组使用语句?

Related 相关文章

  1. 1

    使用QueryBuilder的Symfony2 / Doctrine2 innerJoin

  2. 2

    Symfony3 QueryBuilder orderBy 实体字段

  3. 3

    如何使用symfony3,doctrine2和stofDoctrineExtensionsBundle获取Gedmo Tree元素的路径

  4. 4

    用PhpStorm进行Symfony3调试

  5. 5

    用PhpStorm进行Symfony3调试

  6. 6

    使用Symfony3的API REST的结构

  7. 7

    在symfony3中使用ckeditor

  8. 8

    在symfony3中使用ckeditor

  9. 9

    Symfony3,Doctrine2,自定义夹具加载器

  10. 10

    Symfony3 Doctrine2无法在循环中访问变量

  11. 11

    Symfony3 Doctrine2无法在循环中访问变量

  12. 12

    Symfony3 querybuilder orderby count many manytomany

  13. 13

    Symfony3 queryBuilder 如何使用 OR 进行搜索以及如何搜索子字符串?

  14. 14

    从 Doctrine 实体 (Symfony3) 中获取所有值

  15. 15

    symfony3教义2关联计数器字段

  16. 16

    在使用symfony3的树枝中,“ {%use%}”如何工作?

  17. 17

    Symfony3使用多个AppKernel.php

  18. 18

    在使用symfony3的树枝中,“ {%use%}”如何工作?

  19. 19

    使用LiipImagineBundle和Symfony3找不到图像

  20. 20

    Symfony3 使用 phpunit 测试 redirectToRoute() 方法

  21. 21

    Symfony3 不使用 FormBuilder 上传文件

  22. 22

    在symfony3中使用原则进行右联接查询

  23. 23

    在symfony3中使用原则进行右联接查询

  24. 24

    Symfony2-> Symfony3目录结构更改背后的逻辑是什么?

  25. 25

    Symfony3、Doctrine 2 和 Sonata Admin Bundle 的图像上传问题

  26. 26

    Symfony3,缺少Doctrine \ ORM \ EntityRepository :: __ construct()的参数1,如何以及为什么

  27. 27

    使用Swagger2和Symfony3检索POST参数

  28. 28

    Symfony3对于AppBundle \ Entity \的查询缺少标识符ID

  29. 29

    如何在Symfony3中使用分组使用语句?

热门标签

归档