Yii addInCondition with floats:怎么样?为什么addInCondition('column',array(1.1,1.3))不起作用?

Max*_*lev 9 php sql yii

如何使用浮点数添加条件?

我尝试了很多.

这样可行:

$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)

在我的情况下,它返回4个模型:

但是,如果我尝试

$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$criteria->addInCondition('step',array(3.20));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)

要么

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3.20"));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)

要么

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array('3.2'));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)

结果是空的.

根据日志,查询是:

system.db.CDbCommand.query(SELECT*FROM orders_tasks tWHERE step =:ycp1.绑定:ycp1 = 3.2)

phpmyadmin中的此查询返回5360行

SELECT * FROM  `orders_tasks`  `t` WHERE step = 3.20
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

这试试

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3,20"));
$tasks=OrderTask::model()->findAll($criteria);
Run Code Online (Sandbox Code Playgroud)

返回步长= 3或20的模型

phpmyadmin中的此查询返回step = 3 OR 20的行

SELECT * FROM  `orders_tasks`  `t` WHERE step = '3,20'
Run Code Online (Sandbox Code Playgroud)

那么,如何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 ;
Run Code Online (Sandbox Code Playgroud)

Yii版本:1.1.10

dr0*_*0zd 2

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
Run Code Online (Sandbox Code Playgroud)

在 Yii 日志中查询

SELECT * FROM `prefix_test` `t` WHERE (order_id=:ycp0) AND (step=:ycp1). Bound with :ycp0=36907, :ycp1=3.2
Run Code Online (Sandbox Code Playgroud)

MySql日志中的真实查询

SELECT * FROM `prefix_test` `t` WHERE (order_id=36907) AND (step='3.2')
Run Code Online (Sandbox Code Playgroud)

这将解决你的问题

ALTER TABLE `prefix_test` CHANGE `step` `step` decimal(10,2) NOT NULL;
Run Code Online (Sandbox Code Playgroud)

之后您的查询返回

#Returns Rows: 1
Run Code Online (Sandbox Code Playgroud)