【问题标题】:Symfony - using orWhere() in doctrine query builderSymfony - 在学说查询构建器中使用 orWhere()
【发布时间】: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();
}

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多