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

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

【讨论】:

像魅力一样工作!谢谢你。 @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 在教义查询构建器中选择表之间的特定连接?

学说2:在多对多关系中引用连接表

在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO

Symfony 学说 DQL 随机结果在使用 MaxResult 的查询中

如何使用 symfony2 学说查询生成器选择不同的查询?

学说查询的语法错误 (Symfony2)