如何在学说中左加入子SELECT

问题描述 投票:0回答:2

我不想做任何特殊的魔术,只需将我的查询左连接到子查询即可。我尝试了在互联网上找到的许多方法和技巧,但没有一个有效,而且我总是收到无用的错误消息,这些消息告诉我们注意有意义的问题,或者没有必要寻找解决方案。

这是我的子查询和查询:

$subQuery = $qb
            ->select("DISTINCT TRIM(cp.originalteilenummer) AS productCode")
            ->from(\Vendor\ShopBundle\Entity\ExternalProduct::class, 'cp')
            ->getQuery();


$result = self::$entityManager->createQueryBuilder()
            ->select('c.id,
                      c.manufacturerId,
                      cu.fullName,
                      c.vin,
                      c.plateNumber,
                      c.netDiscountPrice,
                      c.calculationDate,
                      u.loginName,
                      c.lastOfferSentAt,
                      COUNT(DISTINCT i.id) AS items,
                      c.customerDmsId,
                      GROUP_CONCAT(cp.productCode) AS productCodes')
            ->from(\Vendor\ShopBundle\Entity\Calculation::class, 'c')
            ->innerJoin(\Vendor\ShopBundle\Entity\CalculationItem::class, 'i', 'WITH', 'c.id = i.orderId')
            ->leftJoin(\Vendor\UserBundle\Entity\User::class, 'u', 'WITH', 'c.openedBy = u.id')
            ->leftJoin(\Vendor\CoreBundle\Entity\User::class, 'cu', 'WITH', 'c.customerDmsId = cu.user')
            ->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode')
            ->groupBy('c.id')
            ->getQuery()
            ->getScalarResult();

我只想将查询左连接到子查询的数据集。我怎样才能实现这个目标?

如果我运行这个,我会收到错误:

[语义错误]第 0 行,第 773 列,靠近“(SELECT DISTINCT”:错误: 类“(”未定义。

mysql doctrine-orm
2个回答
0
投票

你想要做的事情可能用 QB 和 Doctrine 是不可能实现的。

更好的方法是在WITH IN/NOT IN中使用子查询。但这可能不是您想要的。

来源:

如何在 Doctrine 2 中使用 QueryBuilder 创建带有 SELECT 子查询的 LEFT JOIN?

在 Doctrine 2 中执行 WHERE .. IN 子查询


0
投票

这应该可行,您正在尝试使用

getSQL()
代替使用
getDQL()

->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode')

->leftJoin('VendorShopBundle:ExternalProduct', 'cp', 'WITH', $qb->expr()->eq( 'i.partNumber', '('.$subQuery->getDQL().')' ))
© www.soinside.com 2019 - 2024. All rights reserved.