Laravel的Eloquent ORM:设置模型的数据类型

3

目前我有一个简单的表格,只有两行: idkey

每当我尝试使用 City::get() 从数据库获取数据时,响应中包含字符串格式的 id 列。

是否有一种简单的方法/软件包,可以为我的每个列定义数据格式?例如,这个例子中的 id 应该是一个整数。

模型:

<?php
class City extends Eloquent {

    protected $table = 'cities';
    protected $primaryKey = 'Id';

}

Controller:

class CityController extends \BaseController {

    public function index()
    {
        var_export(is_integer(City::get()->first()->Id));
        var_export(is_string(City::get()->first()->Id));
        die;
    }

}

Output:

false
true


ID列也是整数类型吗? - ka_lin
是的,它是一个自动增量的主键。数据类型是INT。 - user684202
你能粘贴模型吗?这很奇怪,因为我已经添加了一个调试模块来检查数据类型并进行强制转换... - ka_lin
是的,没问题。我刚刚发布了模型和控制器。 - user684202
3个回答

4
Eloquent模型拥有一个属性“casts”,可用于提示每个模型属性的类型。以下是相关链接: 在我的情况下,我使用Eloquent处理一个锁定在PHP 5.4上的遗留应用程序。由于某些随机原因我没有去解决,每个属性都以字符串形式从数据库中检索,并且默认的PHP转换方式给我带来了问题。
您可以使用以下代码:
<?php
class City extends Eloquent {
    protected $table = 'cities';
    protected $primaryKey = 'Id';
    protected $casts = [
        'Id' => 'int'
    ];
}

对于直接在模型上的字段非常出色。但是很遗憾,我无法在数据透视表上找到如何实现这一点。 - Tim Visée

1

数据库中检索到的每个记录字段将成为字符串。

这似乎是PHP中许多db扩展程序的工作原理。

Ruby on Rails保持一个常量映射表以知道tableA.field1是一个整数,因此它可以在提取数据库时将任何内容转换为int。 这显然会带来一些开销,但它可以是一个有用的功能。 Laravel选择不这样做,以便在性能和方便性之间做出权衡。

您可以使用存取器和修改器手动复制此功能。


有没有一些可以解决这个问题的包/库? - user684202
1
据我所知,不会。PHP是弱类型语言,因此PHP并不关心这个问题。这取决于输出的目标位置。为了将内容输出到JSON中,我构建了Fractal,它可以帮助处理各种类型等其他事情:http://fractal.thephpleague.com/ - Phil Sturgeon

0

你确定数据库中的数据类型也是整数(INT)吗? 否则,你可以将字符串转换为整数。例如:

$num = "4.5";
$int = (int)$num;

return gettype($int); // Integer

是的,我对数据库中的数据类型非常确定。也许Laravel在索引时出现了错误?如果是这样的话,有没有重新运行索引过程的方法?对于单个变量,转换是可以的,但如果我有多个表格和各种各样的行 - 在我看来,这种解决方案只会使代码看起来很糟糕。 - user684202

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接