【问题标题】:How to LEFT JOIN a sub SELECT in doctrine如何在学说中左加入子选择
【发布时间】:2018-01-24 06:54:00
【问题描述】:

我不想做任何特殊的魔术,只需将我的查询 LEFT JOIN 加入一个子查询。我尝试了许多在互联网上找到的方法和技巧,但没有一种方法有效,而且我总是收到无用的错误消息,这些错误消息说明问题的意义或没有意义去寻找解决方案。

这是我的子查询和查询:

$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();

我只想将我的查询加入到子查询的数据集中。我怎样才能做到这一点?

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

[Semantical Error] line 0, col 773 near '(SELECT DISTINCT': Error: 类 '(' 未定义。

【问题讨论】:

  • @Veve 当然可以,而且效果很好
  • 花点时间学习 DQL(不是 SQL)的连接语法。提示:leftJoin(c.openBy','u') 就是你所需要的。掌握基础知识,然后专注于您的子查询。
  • @Cerad 没有子查询,基本查询可以正常工作。正如你所说 leftJoin(c.openBy','u') 就足够了,但前提是'c'和'u'之间存在关联,但在这种情况下没有。使用我使用的语法,可以通过给定条件连接两个“不相关”的实体。所以问题仍然是,学说肯定希望在我想传递子查询的地方有一个实体类。

标签: mysql doctrine-orm


【解决方案1】:

您尝试做的事情可能无法通过 QB 和 Doctrine 实现。

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

来源:

How to create LEFT JOIN with SELECT subquery using QueryBuilder in Doctrine 2?

Doing a WHERE .. IN subquery in Doctrine 2

【讨论】:

    【解决方案2】:

    这应该可行,您尝试将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().')' ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2016-01-26
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多