Как addInCondition с поплавками?
Я много пробовал.
Это работает нормально:
$criteria=new CDbCriteria(); $criteria->addInCondition('order_id',array(36907)); $tasks=OrderTask::model()->findAll($criteria);
В моем случае он возвращает 4 модели:
Но если я попробую
$criteria=new CDbCriteria(); $criteria->addInCondition('order_id',array(36907)); $criteria->addInCondition('step',array(3.20)); $tasks=OrderTask::model()->findAll($criteria);
Или
$criteria=new CDbCriteria(); $criteria->addInCondition('step',array("3.20")); $tasks=OrderTask::model()->findAll($criteria);
Или
$criteria=new CDbCriteria(); $criteria->addInCondition('step',array('3.2')); $tasks=OrderTask::model()->findAll($criteria);
Результаты пустые.
Согласно журналу, запрос:
system.db.CDbCommand.query (SELECT * FROM
orders_tasks
t
WHERE step =: ycp1. Связано с: ycp1 = 3.2)
Этот запрос в phpmyadmin возвращает 5360 строк
SELECT * FROM `orders_tasks` `t` WHERE step = 3.20
Эти запросы в phpmyadmin возвращают 0 строк
SELECT * FROM `orders_tasks` `t` WHERE step = '3.20' SELECT * FROM `orders_tasks` `t` WHERE step = '3.2' SELECT * FROM `orders_tasks` `t` WHERE step = "3.20"
Это попытка
$criteria=new CDbCriteria(); $criteria->addInCondition('step',array("3,20")); $tasks=OrderTask::model()->findAll($criteria);
возвращает модели с шагом = 3 ИЛИ 20
Этот запрос в phpmyadmin возвращает строки с шагом = 3 ИЛИ 20
SELECT * FROM `orders_tasks` `t` WHERE step = '3,20'
Итак, как addInCondition
с поплавками?
поле step
– float(8,2)
Сброс таблицы Sql:
CREATE TABLE IF NOT EXISTS `orders_tasks` ( `task_id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL, `step` float(6,2) NOT NULL, `done` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`task_id`), KEY `order_id` (`order_id`), KEY `step` (`step`), KEY `orderstep` (`order_id`,`step`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Версия Yii: 1.1.10
DROP TABLE IF EXISTS `prefix_test`; CREATE TABLE IF NOT EXISTS `prefix_test` ( `task_id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL, `step` float(6,2) NOT NULL, `done` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`task_id`), KEY `order_id` (`order_id`), KEY `step` (`step`), KEY `orderstep` (`order_id`,`step`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; INSERT INTO `prefix_test` VALUES (1,36907,3.20,0); INSERT INTO `prefix_test` VALUES (2,36907,3.21,0); INSERT INTO `prefix_test` VALUES (3,37907,4.13,0); $criteria=new CDbCriteria(); $criteria->addInCondition('order_id',array(36907)); $criteria->addInCondition('step',array(3.20)); $tests=Test::model()->findAll($criteria); echo "Rows: ".count($tests)."<br>"; #Returns Rows: 0
Запрос в журналах Yii
SELECT * FROM `prefix_test` `t` WHERE (order_id=:ycp0) AND (step=:ycp1). Bound with :ycp0=36907, :ycp1=3.2
Реальный запрос в журналах MySql
SELECT * FROM `prefix_test` `t` WHERE (order_id=36907) AND (step='3.2')
Это поможет вам решить проблему
ALTER TABLE `prefix_test` CHANGE `step` `step` decimal(10,2) NOT NULL;
После этого ваш запрос вернется
#Returns Rows: 1