DQL 和 SQL 查询 return 比 QueryBuilder 更多的数据...,怎么样?为什么?

DQL and SQL query return more data than QueryBuilder ..., how? why?

我在 Doctrine Repository 中有以下代码:

$em           = $this->getEntityManager();
$qb           = $em->createQueryBuilder();
$query_result = $qb->select('IDENTITY(l.customer) as customer, COUNT(l) AS total_unattached')
                   ->from('QuoteBundle:License', 'l')
                   ->leftJoin('QuoteBundle:Agreement', 'a', Join::WITH, $qb->expr()->andX(
                       'l.agreementType = a.agreementType',
                       'l.customer = a.customer'
                   ))
                   ->where('l.customer IN (:implode)')
                   ->setParameter('implode', implode(',', $customers_id))
                   ->andWhere('a.agreementNumber IS NULL')
                   ->groupBy('l.customer')
                   ->getQuery()
                   ->getArrayResult();

根据上面的代码,如果我这样做 count($query_result),我将得到 1。 ‌‌

count($query_result) ‌< 1

现在搞笑的是:

我试过之前的Query Builder生成的DQL$qb->getDQL():

SELECT
  IDENTITY(l.customer) AS customer,
  COUNT(l)             AS total_unattached
FROM
  QuoteBundle:License l
LEFT JOIN QuoteBundle:Agreement a WITH l.agreementType = a.agreementType AND l.customer = a.customer
WHERE l.customer IN (21, 23) AND a.agreementNumber IS NULL GROUP BY l.customer

令人惊讶的是我得到了 2 个值:

array (size=2)
  0 => 
    array (size=2)
      'customer' => string '21' (length=2)
      'total_unattached' => string '1' (length=1)
  1 => 
    array (size=2)
      'customer' => string '23' (length=2)
      'total_unattached' => string '17' (length=2)

我试过之前的Query Builder生成的SQL $qb->getQuery()->getSQL():

SELECT
  l0_.CustomerSiteID AS sclr_0,
  COUNT(l0_.id)      AS sclr_1
FROM license l0_
  LEFT JOIN agreement a1_
    ON (l0_.AgreementTypeID = a1_.AgreementTypeID AND l0_.CustomerSiteID = a1_.CustomerSiteID)
WHERE l0_.CustomerSiteID IN (21, 23) AND a1_.AgreementNumber IS NULL
GROUP BY l0_.CustomerSiteID

令人惊讶的是我又得到了 2 个值:

21  1
23  17

以下是以下语句的结果:

dump($qb->getParameters());
dump($qb->getDQL());
dump($qb->getQuery()->getSQL());
dump($query_result);

既然如此,为什么$query_result只有一个?

更新:

我也试过 getResult() 而不是 getArrayResult() 结果是一样的,见下图:

注意前一个 QB returns 生成两行而不是一行的查询:

问题在于作为 :implode 发送的参数 - 您正在发送一个字符串 "21,23",然后仅将其解析为数字 21,删除第二个 ID。 MySQL 会这样做(带有您在此处看不到的警告)。

从正在准备的 SQL 语句可以看出 - l0.CustomerSiteID IN (?) 条件只包含一个 ? 但它应该看起来像 (?, ?) 才能正常工作.

直接使用数组,没有内爆。 QB 应该处理并生成正确的 SQL.