教义或给出奇怪结果的地方

时间:2019-06-09 12:42:44

标签: mysql sql symfony doctrine-orm

我有一个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”的结果。例如:

  • 选择所有类别后,仅返回具有“ 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 :(得分: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);