DAO bindParam и массив

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
MozgoEd
Сообщения: 31
Зарегистрирован: 2012.06.18, 10:51

DAO bindParam и массив

Сообщение MozgoEd »

Добрый день! Разрабатываю проект Yii + DAO + MySQL. Столкнулся с такой проблемой, как имея запрос:

Код: Выделить всё

$ids = array(1, 2, 3, 4, 5);
$sql = 'SELECT login FROM users WHERE id IN (:ids)';
$cmd = Yii::app()->db->createCommand($sql);
$cmd->bindValue(':ids', implode(',' $ids), PDO::PARAM_INT));
$logins = $cmd->queryAll();
Получаю всего лишь один логин, так как функция implode возвращает string ('1, 2, 3, 4, 5'). Как в Yii лучше выкрутиться из подобной ситуации. Погуглил, проблема известная и связана с PDO, просто так передать массив значений нельзя (о какой универсальности PDO вообще можно говорить?). Там придумывают всякие велосипеды, типа в цикле биндить параметры, но это такой костыль. Также нашел реализацию через построитель запросов, но проблема с биндингом массива там тоже остается. Как быть?
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: DAO bindParam и массив

Сообщение lancecoder »

PDO::PARAM_INT
вы уверены?
MozgoEd
Сообщения: 31
Зарегистрирован: 2012.06.18, 10:51

Re: DAO bindParam и массив

Сообщение MozgoEd »

lancecoder писал(а):PDO::PARAM_INT
вы уверены?
Да. Даже если поменять на PDO::PARAM_STR, это ничего не даст. Дело в том, что функция implode() возвращает строку и поэтому PDO генерирует условие, как '1, 2, 3, 4, 5', т.е. string (обратите внимание на одинарные кавычки), а должно быть вот так 1, 2, 3, 4, 5. Если не очень понятно, то вот так:
То, как есть сейчас:
SELECT login FROM users WHERE id IN ('1, 2, 3, 4, 5')
а должно быть, вот так:
SELECT login FROM users WHERE id IN (1, 2, 3, 4, 5)
т.е. тоже самое, но айдишники не должны быть в кавычках
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: DAO bindParam и массив

Сообщение lancecoder »

ну да проблема, это я так понимаю вы читали http://stackoverflow.com/questions/9203 ... -condition , сделайте через ActiveRecord, как вариант от 1 запроса не убудет
MozgoEd
Сообщения: 31
Зарегистрирован: 2012.06.18, 10:51

Re: DAO bindParam и массив

Сообщение MozgoEd »

lancecoder писал(а):ну да проблема, это я так понимаю вы читали http://stackoverflow.com/questions/9203 ... -condition , сделайте через ActiveRecord, как вариант от 1 запроса не убудет
Да, это я читал. ActiveRecord использовать не хотелось бы. Тут нужен какой-нибудь красивый вариант выхода из подобной ситуации.
Аватара пользователя
sergebezborodov
Сообщения: 133
Зарегистрирован: 2010.06.10, 19:53
Откуда: Dnepropetrovsk-Sevastopol, UA
Контактная информация:

Re: DAO bindParam и массив

Сообщение sergebezborodov »

в построителе запросов можно сделать
->where(array('in', 'id', array(1,2,3,4,5)))
A passion to perform
http://sergebezborodov.com
MozgoEd
Сообщения: 31
Зарегистрирован: 2012.06.18, 10:51

Re: DAO bindParam и массив

Сообщение MozgoEd »

sergebezborodov писал(а):в построителе запросов можно сделать
->where(array('in', 'id', array(1,2,3,4,5)))
Да, можно сделать. Но как получить 1, 2, 3, 4, 5 и при этом, чтобы это не было string? :D
Аватара пользователя
Besedin
Сообщения: 88
Зарегистрирован: 2012.07.30, 11:09
Откуда: Kyiv

Re: DAO bindParam и массив

Сообщение Besedin »

ну а если так? :)

Код: Выделить всё

->where(array('in', 'id', $ids))
Аватара пользователя
sergebezborodov
Сообщения: 133
Зарегистрирован: 2010.06.10, 19:53
Откуда: Dnepropetrovsk-Sevastopol, UA
Контактная информация:

Re: DAO bindParam и массив

Сообщение sergebezborodov »

в случае с ->where(array('in', 'id', array(1,2,3,4,5)))
стринга не будет, а вполне себе кошерный WHERE id IN (1,2,3,4,5)
A passion to perform
http://sergebezborodov.com
asmdk
Сообщения: 11
Зарегистрирован: 2014.07.01, 15:08

Re: DAO bindParam и массив

Сообщение asmdk »

sergebezborodov писал(а):в случае с ->where(array('in', 'id', array(1,2,3,4,5)))
стринга не будет, а вполне себе кошерный WHERE id IN (1,2,3,4,5)
а если нужно использовать именно DAO?
на данный момент единственный человеческий вариант который я нашел, это:

Код: Выделить всё

$inputs = array(1,2,3,4,5);
$criteria = new CDbCriteria();
$criteria->addInCondition('id',$inputs);

$sql = 'SELECT * FROM obj WHERE '.$criteria->condition;
$command = Yii::app()->db->createCommand($sql);
$results = $command->queryAll(true, $criteria->params);
 
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: DAO bindParam и массив

Сообщение Ekstazi »

Используйте конструктор запросов, вам уже писали об этом выше. Это просто более удобный интерфейс DAO и не более того.
Ответить