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