簡體   English   中英

Symfony - 在學說查詢構建器中使用 orWhere()

[英]Symfony - using orWhere() in doctrine query builder

我想返回我在消息中搜索的單詞的查詢結果,但只是 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();
}

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

您可以 OR 寫入 QueryBuilder type -> $builder->expr()->orX builder- $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();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM