Symfony - 在学说查询构建器中使用 orWhere()
Posted
技术标签:
【中文标题】Symfony - 在学说查询构建器中使用 orWhere()【英文标题】:Symfony - using orWhere() in doctrine query builder 【发布时间】:2020-08-25 15:41:34 【问题描述】:我想返回我在消息中搜索的单词的查询结果,但只是 userOne 或 userTwo 当前登录用户的位置。
我认为我无法正确定义我的查询生成器,因为在测试时正确返回了登录用户。
我正在尝试使用 orWhere() 子句,但它总是返回该单词的所有结果,而不仅仅是登录用户。
我的代码:
public function search($word, $user)
return $this->getMessageRepository()
->createQueryBuilder('a')
->where('a.message LIKE :message')
->andWhere("a.toUser = $user OR fromUser = $user")
->setParameter('message', '%' . $word. '%')
->setParameter('toUser', $user)
->setParameter('fromUser', $user)
->getQuery()
->getResult();
【问题讨论】:
【参考方案1】:where
语句的逻辑应该按预期工作。
但是您似乎使用了不正确的parameter binding
。
toUser
和 fromUser
是列,因此无需绑定它们。
$user
是我们要过滤的target user
,因此它应该绑定到查询。
一个例子:
return $this->getMessageRepository()
->createQueryBuilder('a')
->where('a.message LIKE :message')
->andWhere("a.toUser = :user OR a.fromUser = :user")
->setParameter('message', '%' . $word. '%')
->setParameter('user', $user)
->getQuery()
->getResult();
【讨论】:
像魅力一样工作!谢谢你。 @xtothea【参考方案2】:您需要指定前缀为a
的所有字段,因为您在createQueryBuilder('a')
中创建了此前缀;
如果您有更多 1 个参数,请使用 setParameters
。
你也可以写成 QueryBuilder 类型 -> $builder->expr()->orX
。
您的查询示例:
public function search($word, $user)
$builder = $this->createQueryBuilder('a');
return $builder
->where('a.message LIKE :message')
->andWhere($builder->expr()->orX(
$builder->expr()->eq('a.toUser', ':user'),
$builder->expr()->eq('a.fromUser', ':user'),
))
->setParameters([
'message' => '%' . $word . '%',
'user' => $user,
])
->getQuery()
->getResult();
【讨论】:
以上是关于Symfony - 在学说查询构建器中使用 orWhere()的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 symfony 在教义查询构建器中选择表之间的特定连接?
在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO