Установить параметр в виде массива int для оператора where in в построителе запросов dbal выдает массив в исключение преобразования строки

#symfony #doctrine-orm #doctrine #query-builder #dbal

#symfony #доктрина-orm #доктрина #построитель запросов #dbal

Вопрос:

Я пытаюсь привязать параметр: [1, 2] в dbal querybuilder в операторе WHERE IN

Я попытался перейти $qb->expr()->in() на строковую версию, но ничего не изменилось

Создание QueryBuilder

 $qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
            ->andWhere($qb->expr()->in('c.id', ':categories'))->setParameter('categories', [1, 2], DoctrineDBALConnection::PARAM_INT_ARRAY);
 

Исполнение:

 $qb->execute()->fetchAll();
 

Ошибка : Array to string conversion

Ожидает привязки массива целых чисел к оператору querybuilder

Комментарии:

1. На какой строке вы получаете эту ошибку и как первая часть связана со второй? куда уходит $ qb? Что такое $this и $filter?

2. Я просто упрощаю код, чтобы показать только проблемное место. Исправлено.

Ответ №1:

всегда люблю цитировать документацию.

 // Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns ExprFunc instance
 

источник: doctrine querybuilder docs

таким образом, по сути, если категории не являются числами, вам нужно заполнить массив заполнителями и установить их, или, если они являются числами, вы, вероятно, можете просто использовать пример.

Ответ №2:

Я предполагаю, что у вас есть объект, который имеет ManyToMany или ManyToOne с объектом категории, вы могли бы просто передать массив категорий, и он должен работать, если массив правильно составлен следующим образом :

 qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
     ->andWhere($qb->expr()->in('c.id',':categories'))->setParameter('categories', $categoriesArray);
 

В противном случае вы можете попытаться использовать setParameter с вашим массивом идентификаторов, взорвав массив :

 qb = $this->_em->getConnection()->createQueryBuilder()
            ->select('c.id AS id')
            ->from('category', 'c')
            ->andWhere($qb->expr()->in('c.id', ':categories'))->setParameter('categories', implode(",",[1, 2]));
 

Комментарии:

1. первый — это то, что именно делает OP, а второй, очевидно, не будет работать должным образом

2. Первое — это не то, что делает OP, передача массива сущностей и массива целых чисел — это не одно и то же.