mysql - 在 Cakephp 2.2 上作为字符串返回的 Float、Decimal、Int mysql 字段

标签 mysql model casting cakephp-2.1

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

float 或小数:

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

内部

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

仅对 bool 字段使用 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 没有通过正确的类型转换返回值?我该如何解决?谢谢!

最佳答案

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

所有人都使用的解决方法是将您希望 float 的变量严格转换为 float ,如您的示例所示。要检查字符串是否为数字,您可以使用 is_numeric()功能:

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

这是"Type Juggling"的概念.对于 float ,您需要记住的是:

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

将全部转换为PHP's Float .随着期待已久的 PHP 6 严格类型化,这个问题将不复存在,但我们还得再等一会儿。至于现在——唯一的办法就是自己处理这些变量。 要在 CakePHP 中为您需要的模型自动管理它,请使用 Model::afterFind() callback .此回调用于“修改从查找操作返回的结果或执行任何其他查找后逻辑。还要注意第二个参数,就像调用模型的 find() 时一样来自关联模型的结果数组的结构将不同。

关于mysql - 在 Cakephp 2.2 上作为字符串返回的 Float、Decimal、Int mysql 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628828/

相关文章:

mysql - ORDER BY 分组字段

php - 比较2个mysql数据库

每个循环的php都不起作用

django - 我应该在 django 模型管理器中进行外部 API 调用吗

python - 如何删除 django 中级联的一对一关联模型?

mysql - 不唯一/表别名 'respite'

python - 如何从破折号下拉菜单中选择并运行模型并更新混淆矩阵图?

r - R reshape2 中 cast() 调用的自定义聚合函数出错

c++ - 无法转换具有多重继承的类

c++ - 如何将 static_cast 与双重类型转换一起使用