Конструктор запросов Symfony2 Doctrine, где IN

Я потерял триллион часов в гугле, но ни одно из решений не было хорошим.

У меня есть этот построитель запросов:

        $qb2=$this->createQueryBuilder('s')
        ->addSelect('u')
        ->innerJoin('s.user','u')
        ->where("u.id IN(:followeeIds)")
        ->andWhere('s.admin_status = false')
        ->setParameter('user', $user)
        ->setParameter('followeeIds', $arrayFolloweeIds)
        ->orderBy('s.id','DESC')
        ->setMaxResults(15)
    ;

Я мог бы сделать второй запрос, а затем сделать как $qb->getDQL(), но должен ли я кэшировать запрос?

Ошибка:

Invalid parameter number: number of bound variables does not match number of tokens

person Lukas Lukac    schedule 27.04.2013    source источник


Ответы (2)


Вы устанавливаете пользовательский параметр, но я нигде не вижу, чтобы он использовался в запросе?

Также у меня были проблемы с WHERE IN, и Doctrine QueryBuilder с массивами выдавала аналогичную ошибку, и, как ни странно, запуск array_values перед привязкой параметра, похоже, также решил эти проблемы.

Пытаться:

$qb2=$this->createQueryBuilder('s')
        ->addSelect('u')
        ->innerJoin('s.user','u')
        ->where("u.id IN(:followeeIds)")
        ->andWhere('s.admin_status = false')
        ->setParameter('followeeIds', array_values($arrayFolloweeIds))
        ->orderBy('s.id','DESC')
        ->setMaxResults(15)
    ;
person Ghassan Idriss    schedule 27.04.2013
comment
о боже, я чувствую себя таким глупым... конечно, пользователь! я этого не заметил ... и да, array_values ​​помог! И теперь, наконец, волшебно работающий $arrayFolloweeIds=implode(',',$arrayFolloweeIds)... надеюсь, люди найдут его. Спасибо ! - person Lukas Lukac; 27.04.2013
comment
array_values мне тоже помог. Но почему? Я использовал индексированный массив. А с другой стороны, с запросом на удаление работало и без array_values. Я использую доктрину/орм v2.5.4 - person alpham8; 22.11.2017
comment
Я думаю, что проблема вызвана неправильным числовым индексом в массиве или, возможно, наличием строковых числовых индексов. Не уверен на 100%, но если это так, то работает array_values, потому что он дает вам новый правильно проиндексированный массив - person Ghassan Idriss; 22.11.2017

В Symfony2.8 мне помогает следующий пример

...
$qb2->where(
     $qb2->expr()->in('u.id', ':ids')
)
->setParameter('ids', $ids_array)
...
person young B    schedule 13.09.2017
comment
хорошо, кстати, @young - плохая практика называть переменную на основе ее значения. Например, массив, строка. Значимого имени более чем достаточно: $ids для списка идентификаторов и $id, если это просто одно целое число :) - person Lukas Lukac; 01.11.2017
comment
Спасибо, @EnchanterIO. Я согласен в этом случае. Но PHP не поддерживает явный тип. Итак, как я могу узнать, какой тип переменной используется? Например, у меня есть список целых чисел, разделенных запятой, или массив session_keys? Не могли бы вы привести более весомые аргументы? Спасибо :) - person young B; 02.11.2017
comment
Конечно. Если у вас есть список целых чисел, разделенных запятой, то у вас нет массива, у вас есть строка. Поэтому я бы назвал это: commaConcatinatedIds. И перейдите на PHP 7, чтобы получить строгие типы;) если у вас есть дополнительные вопросы, вы можете связаться со мной в твиттере: twitter.com/EnchanterIO - person Lukas Lukac; 02.11.2017
comment
$ids подразумевает несколько, поэтому я ожидаю массив. Если это не так, я бы назвал его $idsString, так как он содержит строковое значение и является аномальным. - person Martijn; 30.05.2018