2011-10-12 189 views
5

使用本机查询与数组中的参数我有这样的原生SQL编写的教义我怎样才能在Doctrine2

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

我该如何解决这个问题?

回答

0

我想你可以通过使用做到这一点很容易:

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

学说将自动转换成$taskType正确的格式。

+0

在此情况下,它抱怨改变数组的字符串。 –

1

在这种情况下帮助别人:

刚才我偶然到了这个问题,使用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