我用学说编写了这个原生 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');
我该如何解决这个问题?
如果这对其他人有帮助:
我刚刚在使用 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
我认为你可以通过使用轻松做到这一点:
$query->setParameter('taskType', $taskType);
Doctrine 会自动将
$taskType
转换为正确的格式。
试试这个:
$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();