Symfony - 在学说查询构建器中使用 orWhere()
Symfony - using orWhere() in doctrine query builder
我想return查询我在消息中搜索的词的结果,但就在userOne或userTwo当前登录用户的位置。
我认为我无法正确定义我的查询生成器,因为在测试时,以其他方式登录的用户 return 已正确编辑。
我正在尝试使用 orWhere() 子句,但它始终 return 是该词的所有结果,而不仅仅是针对登录用户。
我的代码:
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();
}
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();
}
您需要指定带有前缀 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();
}
我想return查询我在消息中搜索的词的结果,但就在userOne或userTwo当前登录用户的位置。
我认为我无法正确定义我的查询生成器,因为在测试时,以其他方式登录的用户 return 已正确编辑。
我正在尝试使用 orWhere() 子句,但它始终 return 是该词的所有结果,而不仅仅是针对登录用户。
我的代码:
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();
}
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();
}
您需要指定带有前缀 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();
}