Массив не в массиве для запроса доктрины - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно использовать условие, как массив не в массиве. У меня есть массив, который имеет два элемента для поиска. Например

(3,1) NOT IN ((2,3), (1,3), (1,32))

это работает как SQL-запрос в phpmyadmin. Но не сработал как доктринальный запрос.

$em = $this->getDoctrine()->getManager(); 

$qb = $em->getRepository('FangoUserBundle:User')
        ->createQueryBuilder('user')  
        ->leftJoin('user.collabInvitationTarget', 'invite')
        ->where('(:currentUserId, user.id) NOT IN (:inviteArr)')
        ->setParameter('currentUserId', $this->getUser()->getId())
        ->setParameter('inviteArr', $invites, \Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

Исключение было сгенерировано во время рендеринга шаблона ("[Синтаксическая ошибка], строка 0, столбец 304: Ошибка: ожидаемая доктрина \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS, полученный ','") в FangoCollabaignBundle: По умолчанию: index.html.twig в строке 54.

Любой совет?

1 Ответ

0 голосов
/ 13 мая 2018

Это может быть не окончательный ответ, но здесь есть несколько вещей, которые нужно исправить.

  1. Хотя это допустимо в базовом SQL, запрос должен быть между двойными кавычками, а строка - между простыми кавычками. Не наоборот.

  2. Из вашего кода я предполагаю, что ваш пользовательский запрос находится в контроллере. Было бы лучше переместить его в хранилище сущностей с новой функцией, а затем вызвать эту функцию в вашем контроллере.
    Странно, что вы не получите ошибку для createQueryBuilder(), так как она не существует в этом контексте.

  3. Избегайте псевдонимов, которые могут быть ошибочно приняты за имена сущностей.

  4. Ваш запрос неверен в отношении where() Я думаю.

Учитывая, что вы применили пункт 2, я бы попробовал это сделать.

public function getNameYourFunction($user, $invites) {
    $em=$this->getEntityManager();
    $qb=$em->createQueryBuilder()

    $qb->select("u")
       ->from(User::class, "u")
       ->leftJoin("u.collabInvitationTarget", "i")
       ->where($qb->expr()->notin("u.id", "(:inviteArrA)"))
       ->andWhere($qb->expr()->notin(":currentUserId", "(:inviteArrB)"))
       ->setParameters(array(
           'currentUserId'=>$user->getId(),
           'inviteArrA'=>implode(',', $invites),
           'inviteArrB'=>implode(',', $invites),
       ));
}

Вы заметите, что я использую User::class.
Обязательно импортируйте его в свой репозиторий, добавив следующую строку:
use FangoUserBundle\Entity\User; (может отличаться use в вашем случае)

Это то, что я бы сделал на основе вашего кода. Сообщите нам, если это решило вашу проблему.

...