Symfony — использование orWhere() в построителе запросов doctrine

#php #symfony #orm #doctrine-orm

#php #symfony #orm #doctrine-orm

Вопрос:

Я хочу вернуть результат запроса для слов, которые я ищу в сообщении, но только там, где пользователь один или 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 .

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

Комментарии:

1. Работает как шарм! Спасибо. @xtothea

Ответ №2:

Вам необходимо указать все поля с префиксом a , потому что вы создаете этот префикс в createQueryBuilder('a') ;

Если у вас больше 1 параметра, используйте setParameters .

И вы можете ИЛИ написать в QueryBuilder type -> $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();
    }