доктрина 2 — построитель запросов условные запросы… Операторы If?

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