У меня есть 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);
}
Кто-нибудь видит, что я делаю неправильно?