2013-07-11 62 views
2

我试图运行原始SQL查询与IN条款的教条entitymanager如下所示。与IN条款Symfony2.3原始SQL查询

$idSArray = Array ([0] => 1 [1] => 2) 

    $stmt = $this->getDoctrine()->getEntityManager() 
    ->getConnection() 
    ->prepare('SELECT t1.id , t1.name , t2.start_date , t2.end_date 
    FROM table1 t1 , table2 t2 
    WHERE t1.id = t2.matchId AND t1.id IN (:ids)'); 


    $params = array(
     'ids' => implode(",", $idSArray) 
    ); 
    $stmt->execute($params); 
    $results = $stmt->fetchAll(); 

但我只得到结果的编号= 1。如果我硬编码凡在条件为

 WHERE t1.id = t2.matchId AND t1.id IN (1,2)'); 

两者的IDS然后得到结果。任何人都可以告诉我,我做错了传递$ params数组。我还打印输出1,2的内爆结果。所以我无法找到错误,也无法用IN子句执行原始SQL查询。

+0

的[我有一个整数数组,我怎么使用每一个在MySQL查询(在可能重复php)?](http://stackoverflow.com/q/330268/1503018) – sectus

回答

11

答:

因此,有你这样做至少有两个错误。第一个是@Alarid说的:你不应该打乱你的阵列。第二个是在运行预备语句时必须使用DoctrineDBALTypes Conversion代替IN clause

最后你的查询会这样:

$stmt = $this->getDoctrine()->getEntityManager() 
     ->getConnection() 
     ->prepare('SELECT t1.id , t1.name , t2.start_date , t2.end_date 
     FROM table1 t1 , table2 t2 
     WHERE t1.id = t2.matchId AND t1.id IN (:ids)'); 

$stmt->bindValue('ids', $idSArray, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY); 
$stmt->execute(); 

或者备选:

$stmt = $this->getDoctrine()->getEntityManager() 
    ->getConnection() 
    ->executeQuery('SELECT t1.id , t1.name , t2.start_date , t2.end_date 
     FROM table1 t1 , table2 t2 
     WHERE t1.id = t2.matchId AND t1.id IN (:ids)', 
     array('ids' => $idSArray), 
     array('ids' => \Doctrine\DBAL\Connection::PARAM_INT_ARRAY) 
    ) 
; 
+3

你的第一个替代方案目前失败,一个数组字符串转换错误。第二个替代方案有效。这也在手册中说明: 参数列表支持仅适用于Doctrine \ DBAL \ Connection :: executeQuery()和Doctrine \ DBAL \ Connection :: executeUpdate(),而不与预处理语句的绑定方法一起使用。 – 10us

1

你必须让你的数组作为一个数组,不要使它崩溃。

$params = array(
    'ids' => $idSArray 
); 
+2

在这种情况下,我得到错误 注意:数组到字符串转换在..... \供应商\教条\ dbal \ lib \ Doctrine \ DBAL \ Statement.php行138 – xyz

+0

你能告诉我更多关于这个错误吗?我不记得如何做到这一点,但我认为你不需要崩溃你的阵列。看看http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html,点4.2.2 – Alarid