Доктрина или Где дают странные результаты - PullRequest
0 голосов
/ 09 июня 2019

У меня есть FaqEntry класс. Этот объект имеет свойство categories, которое является массивом. Возможные значения: «CAT1», «CAT2», «CAT3», «CAT4». У меня есть класс FaqEntryRepository с методом, который возвращает построитель запросов для большинства общих случаев использования. Я могу дать ему массив категорий, и FaqEntries будет фильтроваться по заданным категориям.

Ниже приведен фрагмент кода, который я хотел использовать для фильтрации всех категорий. НЕТ других where(), andWhere() или orWhere() предложений, только orderBy() и setMaxResults().

if ($categories) {
    foreach ($categories as $category) {
        if (CategoryEnum::isValid($category)) {
            $queryBuilder
                ->orWhere('fe.categories LIKE :category')
                ->setParameter('category', '%' . $category . '%')
            ;
        }
    }
}

Однако, когда я получаю результаты, он получает только те, в которых установлен «CAT4». Так, например:

  • когда выбраны все категории, возвращаются только записи, имеющие "CAT4".
  • при фильтрации только по «CAT1» возвращает только те записи, в которых установлены «CAT1» и «CAT4».

Это способ решить эту проблему, но он мне нравится меньше, потому что теперь я сам подделываю SQL:

if ($categories) {
    $whereString = '';
    foreach ($categories as $category) {
        if (CategoryEnum::isValid($category)) {
            $whereString .= 'or fe.categories LIKE \'%' . $category . '%\'';             }
        }
    $whereString = substr($whereString, 3);
    $queryBuilder->andWhere($whereString);
}

Кто-нибудь видит, что я делаю неправильно?

1 Ответ

0 голосов
/ 09 июня 2019

Я до сих пор не уверен, ПОЧЕМУ это происходит, но вот лучшее решение, использующее построитель запросов Doctrine. Я нашел решение здесь: https://stackoverflow.com/a/48906639/2619074

$orStatements = $queryBuilder->expr()->orX();
foreach ($categories as $category) {
    $orStatements->add(
        $queryBuilder->expr()->like(
            'fe.categories',
             $queryBuilder->expr()->literal('%' . $category . '%')
        )
    );
}
$queryBuilder->andWhere($orStatements);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...