首页 > 解决方案 > 教义或在哪里给出奇怪的结果

问题描述

我有一FaqEntry堂课。这个对象有一个属性categories,它是一个数组。它的可能值是“CAT1”、“CAT2”、“CAT3”、“CAT4”。我有一个FaqEntryRepository类,它的方法返回大多数一般用例的查询构建器。我可以给它一个类别数组,并且 FaqEntries 将根据给定的类别进行过滤。

以下是我想用来过滤所有类别的代码。没有其他where(), andWhere()ororWhere()子句,只有 anorderBy()和 a 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);
}

有人看到我做错了吗?

标签: mysqlsqlsymfonydoctrine-orm

解决方案


我仍然不确定为什么会发生这种情况,但这是使用 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);

推荐阅读