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