如何在 Doctrine2 中使用带有数组 IN 参数的本机查询

问题描述 投票:0回答:3

我用学说编写了这个原生 SQL

SELECT COUNT(DISTINCT t.int_task_type_id) as a_count
FROM tbl_xref_people_task t
WHERE t.bit_completed = true AND
      t.int_people_id = :peopleId AND
      t.int_task_type_id IN (:taskType)

我必须用本机 SQL 编写它,因为 int_task_type_id 是分层模型类中的鉴别器列。

问题是我无法执行以下操作:

$query->setParameter(':taskType', implode(', ',$taskType));

或者这个:

$query->setParameter(':taskType', $taskType, 'array');

我该如何解决这个问题?

php database doctrine-orm
3个回答
2
投票

如果这对其他人有帮助:

我刚刚在使用 Doctrine 2.0.5(ish)的旧 Zend 1.11 版本中偶然发现了这个问题。我发现上述内容不适用于我的 PDO 连接。我相信 PDO 在参数周围添加引号,因此您不能使用上面的内容。

我发现唯一有效的方法是:

$types = [];
$binds = [];
$values = [];

foreach ($taskTypes as $taskType) {
    $types[] = \PDO::INT;
    $binds[] = '?';
    $values[] = $taskType;
}
// Get Entity Manager from wherever
$conn = $entityManager->getConnection();
$stmt = $conn->executeQuery("SELECT COUNT(DISTINCT
    t.int_task_type_id) as a_count
    FROM tbl_xref_people_task t
    WHERE t.bit_completed = true AND
    t.int_people_id = :peopleId AND
    t.int_task_type_id IN (" . implode(',', $binds) . ")",
    $values,
    $types
);
$stmt->execute();
$stmt->fetchAll(); // Fetch

0
投票

我认为你可以通过使用轻松做到这一点:

$query->setParameter('taskType', $taskType);

Doctrine 会自动将

$taskType
转换为正确的格式。


0
投票

试试这个:

$query = 'SELECT COUNT(DISTINCT t.int_task_type_id) as a_count
    FROM tbl_xref_people_task t
    WHERE t.bit_completed = :bitCompleted AND
    t.int_people_id = :peopleId AND
    t.int_task_type_id IN (:taskTypes)';

$params = [
    'bitCompleted' => true,
    'peopleId' => $peopleId,
    'taskTypes' => $taskType
];
$types = [
    'bitCompleted' => Doctrine\DBAL\ParameterType::BOOLEAN,
    'peopleId' => Doctrine\DBAL\ParameterType::INTEGER,
    'taskTypes' => Doctrine\DBAL\Connection::PARAM_STR_ARRAY
];

$conn = $entityManager->getConnection();
$stmt = $conn->executeQuery($query, $params, $types);
$resultset = $stmt->fetchAllAssociative();
© www.soinside.com 2019 - 2024. All rights reserved.