4

以下に示すように、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();

しかし、Id = 1 の結果しか得られません。WHERE IN 条件を次のようにハードコードすると、

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

次に、両方の ID の結果を取得します。$params 配列を渡す際に私が間違っていることを誰かに教えてもらえますか。1,2 を出力する implode の結果も出力しました。そのため、間違いを見つけることができず、IN 句を使用して生の SQL クエリを実行する方法もわかりません。

4

3 に答える 3

16

答え:

したがって、あなたが犯した間違いは少なくとも 2 つあります。1つ目は、@Alaridが言ったことです。配列を内破しないでください。2 つ目は、準備済みステートメントを実行するときにDoctrineDBALTypes Conversionforを使用する必要があることです。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)
    )
;
于 2013-07-11T09:43:42.887 に答える
0

配列を配列として許可する必要があります。内破しないでください。

$params = array(
   'ids'  => $idSArray
);
于 2013-07-11T09:25:52.823 に答える