在Cakephp 2.2上以字符串形式返回的Float,Decimal,Int mysql字段

时间:2013-01-31 15:05:03

标签: mysql model casting cakephp-2.1

我在CakePHP 2.2中有一个应用程序& MySQL的。 我注意到返回值的类型转换是许多类型的字符串,如Float,Decimal,Int,Varchar,Text等..:

Float或Decimal:

var_dump($this->field('field_name'));
string(4) "1.00" 

内部

var_dump($this->field('field_name'));
string(1) "1" 

仅在使用TINYINT(1)作为布尔字段时才会出现此问题:

TINYINT(1)

var_dump($this->field('field_name'));
bool(true) 

通常对于货币字段我将字段类型设置为FLOAT或DECIMAL(11,2)...也许我错误在CakePHP中使用这种类型? 这种行为非常繁琐,特别是对于十进制字段,因为当值为0时,返回字符串“0.00”,即为真。 所以我必须永远记得强制这样的类型:

if((float)$this->field('price')){
....
}

为什么CakePHP不会通过正确的类型转换返回值?我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:1)

这不是CakePHP问题。这是由于PHP脚本语言中目前使用的松散类型。 TinyInt和Boolean工作,因为它被转换为bool类型。

所有人都使用的工作是严格地将你希望浮动的变量转换为浮动,如你的例子所示。要检查字符串是否为数字,您可以使用is_numeric()函数:

if (is_numeric($testedFloatString)) {
    //If $testedFloatString is a string representing a number cast it to float
    $testedFloatString = (float) $testedFloatString;
}

这是"Type Juggling"的概念。你需要记住的浮点数是:

$varName = (float) $varName;
$varName = (double) $varName;
$varName = (real) $varName;

将全部投放到PHP's Float。期待已久的PHP 6严格打字将不复存在这个问题,但我们将不得不等待更多。至于现在 - 唯一的方法是自己处理这些变量。 要在CakePHP中为您需要的模型自动管理此项,请使用Model::afterFind() callback。此回调用于“修改从查找操作返回的结果或执行任何其他查找后逻辑。还要注意第二个参数,例如从关联模型调用模型的find()时结果数组的结构会有所不同。