#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, передача массива сущностей и массива целых чисел — это не одно и то же.