#doctrine #doctrine-orm #query-builder
#доктрина #доктрина-orm #конструктор запросов
Вопрос:
Мой запрос — doctirne 2. у меня есть поле статуса в users, частное или общедоступное. я хочу иметь возможность запускать этот запрос и отображать все комментарии, где статус = общедоступный и закрытый, только если идентификатор пользователя = текущий зарегистрированный идентификатор пользователя (который я знаю, $ loggerUserVarID)
$q = $this->em->createQueryBuilder()
->select('c')
->from('EntitiesComments', 'c')
->leftJoin('c.users', 'u')
->where('status = public') ??? display all public comments but private if it belpongs to the logged in user.?
->setParameter(1, $loggerUserVarID)
->getQuery();
на данный момент я использую оператор if после получения результатов, есть ли способ выполнить оператор if внутри этого запроса?
Комментарии:
1. Что раздражает: комментарий имеет свойство users — означает, что несколько пользователей сопоставлены с комментарием? Как это будет работать? У комментария не может быть только одного владельца (пользователя)?
Ответ №1:
Итак, вы хотите возвращать комментарии «Если статус «общедоступный» или идентификатор владельца равен $ loggedUserVarID», верно?
Обратите внимание, что если $loggedUserVarID совпадает с владельцем, вас действительно не волнует статус.
Ознакомьтесь с документами querybuilder и dql. Они довольно четко объясняют, как составить сложные условия where.
Вероятно, вам нужно что-то вроде:
$q = $this->em->createQueryBuilder()
->select('c')
->from('EntitiesComments', 'c')
->join('c.users', 'u')
->where(
$qb->expr()->orX(
$qb->expr()->eq('status','public'),
$qb->expr()->eq('u.id',$loggedInUser)
)
)
->setParameter(1, $loggerUserVarID)
->getQuery();
Комментарии:
1. вы также можете сделать так: $ors = $ qb-> expr()-> orX(); $ors-> add($ qb-> expr()-> like(‘FirstName’, $ qb-> expr()->literal(«%john%»))); $ors->add($qb-> expr()->like(‘LastName’, $ qb-> expr()->literal(«%john%»))); $ qb->andWhere($ ors);