Является ли это правильным способом обработки упорядоченного массива с помощью выражения WHERE IN в Doctrine2? - PullRequest
4 голосов
/ 25 марта 2011

Используя Zend Lucene Search, я возвращаю список упорядоченных по релевантности идентификаторов, которые сопоставляются с записями блога, которые я получу из базы данных.

Является ли это правильным способом обработки массива с помощью Doctrine2 WHERE INвыражение:

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

Или, может быть, есть лучший способ передать фактический массив $ids в качестве параметра запроса?

Кроме того, Zend Search возвращает массив идентификаторов в зависимости от релевантности. Сохранит ли использование вышеуказанной техники порядок релевантности при получении сообщений в блоге?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

Если вам становится лучше, вы можете использовать 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');

Это немного чище, но делает то же самое, что и вы за экранами.

1 голос
/ 14 апреля 2011

Вы должны вставить массив $ ids через функцию setParameter (), так как это лучший метод в доктрине:

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

Я думаю, что оператор IN не сохранит порядок переданных идентификаторов, как INсоответствует первому найденному идентификатору $ вне зависимости от порядка.

...