Массив не в массиве для запроса доктрины

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

(3,1) НЕ В ((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: Ошибка: Expected Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS, got ‘,’») в FangoCollabaignBundle: Default : index.html.twig в строке 54.

Любой совет ?

Думаю проблема исходит от вашего ГДЕ. Чего именно вы ждете от этого состояния?   —  person Mehmet Soylu    schedule 13.05.2018

(array) [currentUserId, user.id] не должно в (array) [:inviteArr]   —  person Mehmet Soylu    schedule 13.05.2018

См. также:  Пользовательская аутентификация Laravel: маршрут [логин] не определен
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Mehmet Soylu

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

    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)

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

    Нет, это не верное решение, но спасибо за потраченное время, и вы дали мне идею. Я сделал хитрость для массива поиска и массива стога сена. Я объединяю элемент с подчеркиванием вроде 3_2 и (3_1, 4_2) и ищу только один элемент. На данный момент это работает. person Mehmet Soylu; 13.05.2018

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: