Doctrine QueryBuilder 不返回 JOIN 和 WHERE IN 查询的所有行
Doctrine QueryBuilder not returning all rows for JOIN and WHERE IN query
我正在编写一个 Shopware 插件,我有以下代码来构建一个 SQL 查询:
$queryBuilder = $this->container->get('dbal_connection')->createQueryBuilder();
$queryBuilder->select('a.articleID', 'v.optionID', 'v.value')
->from('s_filter_articles', 'a')
->leftJoin('a', 's_filter_values', 'v', 'a.valueID = v.id')
->where('a.articleID IN (:ids)')
->andWhere('v.optionID IN (3, 8)')
->orderBy('a.articleID, v.optionID')
->setParameter(':ids', $relatedIds);
根据$queryBuilder->getSql()
构建的SQL字符串如下:
SELECT a.articleID, v.optionID, v.value
FROM s_filter_articles a LEFT JOIN s_filter_values v ON a.valueID = v.id
WHERE (a.articleID IN (:ids)) AND (v.optionID IN (3, 8))
ORDER BY a.articleID, v.optionID ASC
当我用“1,2,3,4,5”替换“:ids”并执行查询时,所有行都按预期返回。 (我确保 $relatedIds 也是“1,2,3,4,5”。)
当我在 PHP 中执行查询时(通过 $queryBuilder->execute()->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC)
),仅返回第一个 ID (1) 的结果。 var_dump($result)
显示以下内容:
array(1) { [1]=> array(2) { [0]=> array(2) { ["optionID"]=> string(1) "3" ["value"]=> string(13) "Schwarz Kombi" } [1]=> array(2) { ["optionID"]=> string(1) "8" ["value"]=> string(7) "Schwarz" } } }
为什么这不返回其他 ID (2,3,4,5) 的结果?
我想你需要一个真正的数组
->setParameter(':ids', $relatedIds);
例如
$relatedIds = [1,2,3,4,5]
问题是 $relatedIds 是一个字符串,所以 setParameter(':ids', $relatedIds) 用引号插入它
WHERE a.articleID IN ('1,2,3,4,5')
而不是
WHERE a.articleID IN (1,2,3,4,5)
我需要传递一个数组而不是字符串来实现我想要的。
另外,需要给setParameter传递一个类型:
setParameter(':ids', $relatedIds, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);
我正在编写一个 Shopware 插件,我有以下代码来构建一个 SQL 查询:
$queryBuilder = $this->container->get('dbal_connection')->createQueryBuilder();
$queryBuilder->select('a.articleID', 'v.optionID', 'v.value')
->from('s_filter_articles', 'a')
->leftJoin('a', 's_filter_values', 'v', 'a.valueID = v.id')
->where('a.articleID IN (:ids)')
->andWhere('v.optionID IN (3, 8)')
->orderBy('a.articleID, v.optionID')
->setParameter(':ids', $relatedIds);
根据$queryBuilder->getSql()
构建的SQL字符串如下:
SELECT a.articleID, v.optionID, v.value
FROM s_filter_articles a LEFT JOIN s_filter_values v ON a.valueID = v.id
WHERE (a.articleID IN (:ids)) AND (v.optionID IN (3, 8))
ORDER BY a.articleID, v.optionID ASC
当我用“1,2,3,4,5”替换“:ids”并执行查询时,所有行都按预期返回。 (我确保 $relatedIds 也是“1,2,3,4,5”。)
当我在 PHP 中执行查询时(通过 $queryBuilder->execute()->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC)
),仅返回第一个 ID (1) 的结果。 var_dump($result)
显示以下内容:
array(1) { [1]=> array(2) { [0]=> array(2) { ["optionID"]=> string(1) "3" ["value"]=> string(13) "Schwarz Kombi" } [1]=> array(2) { ["optionID"]=> string(1) "8" ["value"]=> string(7) "Schwarz" } } }
为什么这不返回其他 ID (2,3,4,5) 的结果?
我想你需要一个真正的数组
->setParameter(':ids', $relatedIds);
例如
$relatedIds = [1,2,3,4,5]
问题是 $relatedIds 是一个字符串,所以 setParameter(':ids', $relatedIds) 用引号插入它
WHERE a.articleID IN ('1,2,3,4,5')
而不是
WHERE a.articleID IN (1,2,3,4,5)
我需要传递一个数组而不是字符串来实现我想要的。
另外,需要给setParameter传递一个类型:
setParameter(':ids', $relatedIds, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);