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.

toUserfromUser 是列,因此不需要绑定它们。

$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();
    }