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.
我在 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.