我有一个FaqEntry
班。该对象具有属性categories
,它是一个数组。可能的值为“ CAT1”,“ CAT2”,“ CAT3”,“ CAT4”。我有一个FaqEntryRepository
类,该类的方法返回大多数常规用例的querybuilder。我可以给它一个类别数组,而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”的结果。例如:
这是解决问题的一种方法,但是我不太喜欢它,因为现在我自己伪造了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);
}
有人看到我在做什么错吗?
答案 0 :(得分:0)
我仍然不确定为什么会发生这种情况,但这是使用Doctrine querybuilder的更好的解决方案。 I found the solution here: 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);