4

Zend Lucene Searchを使用して、データベースからフェッチするブログレコードにマップする関連性順に並べられたIDのリストを返します。

これは、Doctrine2のWHEREIN式を使用して配列を処理する適切な方法ですか。

$dql = "SELECT b FROM BlogPost WHERE b.id IN (" . implode(', ', $ids) . ")";
$query = $em->createQuery($dql);
...

$idsまたは、実際の配列をパラメータとしてクエリに渡すためのより良い方法はありますか?

また、Zend Searchは、関連性に基づいてIDの配列を返します。上記の手法を使用すると、ブログ投稿を取得する際の関連性の順序が維持されますか?

4

2 に答える 2

4

気分が良くなる場合は、ExpressionBuilderを使用できます。

$ex = $em->getExpressionBuilder();
$dql = 'SELECT b FROM BlogPost b WHERE ' . $ex->in('b.id', $ids));
$query = $em->createQuery($dql);

function cmp($a, $b) {
    global $ids;
    return (array_search($a->getId(), $ids) < array_search($b->getId(), $ids)) ? -1 : 1;
}
usort($res, 'cmp');

それは少しきれいですが、画面の後ろであなたと同じことをします。

于 2011-04-15T09:15:45.990 に答える
1

これは教義のベストプラクティスであるため、setParameter()関数を介して$ids配列をパスする必要があります。

$query = $this->_em->createQuery('SELECT b FROM BlogPost WHERE b.id IN (?1)');
$query->setParameter(1, implode(',', $ids));

INは、順序に依存せずに最初に見つかった$ idと一致するため、INステートメントは渡されたIDの順序を保持しないと思います。

于 2011-04-14T09:20:08.380 に答える