mysql - 教义或在哪里给出奇怪的结果
问题描述
我有一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”的结果。例如:
- 选择所有类别时,仅返回具有“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);
}
有人看到我做错了吗?
解决方案
我仍然不确定为什么会发生这种情况,但这是使用 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);
推荐阅读
- android - 如何在.net片段中的哈希图中的列表视图中通过url加载图像
- python - 根据行中最大的大小,将“大”、“中”、“小”写入新列
- c - snd_pcm_hw_params_set_buffer_size() 错误:“无效参数”
- c# - 如何将 ushorts 转换为字符串?
- google-cloud-spanner - 可以将新表交错到二级索引表中吗?
- python - 将字典理解转换为 DataFrame
- sql - 在 Oracle SQL 中获取 ora-00927 缺少等号,但我显示了所有需要的等号
- javascript - 我的代码中出现错误。我正在使用 React、NPM 和样式化组件。我需要采取哪些步骤?
- android - 将 React Native(或任何其他框架)与 Unity 链接
- php - 检查用户帐户状态是否已更改,如果管理员在 laravel 中将其设置为非活动状态,则将其注销