使用IN Clause进行Symfony2.3原始sql查询

xyz*_*xyz 2 php mysql symfony

我正在尝试使用doctrine entitymanager为IN子句运行原始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();
Run Code Online (Sandbox Code Playgroud)

但我只得到Id = 1的结果.如果我将WHERE IN条件硬编码为

     WHERE t1.id = t2.matchId AND  t1.id IN (1,2)');
Run Code Online (Sandbox Code Playgroud)

然后获得两个ID的结果.谁能告诉我在传递$ params数组时我做错了什么.我还打印了输出1,2的内爆结果.所以我无法找到错误以及使用IN子句执行原始sql查询的方法.

Has*_*ast 12

回答:

所以你做的至少有两个错误.第一个是@Alarid所说的:你不应该破坏你的阵列.第二个是,你必须使用DoctrineDBALTypes ConversionIN 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();
Run Code Online (Sandbox Code Playgroud)

或替代方案:

$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)
    )
;
Run Code Online (Sandbox Code Playgroud)

  • 您的第一个替代方案当前因Array to string转换错误而失败.第二种选择有效.这也在手册中说明:参数列表支持仅适用于Doctrine\DBAL\Connection :: executeQuery()和Doctrine\DBAL\Connection :: executeUpdate(),而不适用于预准备语句的绑定方法. (3认同)