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

Posted

技术标签:

【中文标题】Laravel Eloquent ORM:设置模型的数据类型【英文标题】:Laravels Eloquent ORM: setting datatypes of the model 【发布时间】:2014-08-23 01:32:04 【问题描述】:

目前我有一个包含两行的简单表格:idkey

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

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

型号:

<?php
class City extends Eloquent 

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


控制器:

class CityController extends \BaseController 

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


输出:

false
true

【问题讨论】:

id 列也是 int 吗? 是的,它是一个自动递增的主键。数据类型为 INT。 可以粘贴模型吗?这很奇怪,因为我添加了一个用于调试的模块,它会检查数据类型并将它们转换... 是的,当然。刚刚发布了模型和控制器。 【参考方案1】:

Eloquent 模型有一个属性casts,可用于提示每个模型属性的类型。

5.0:https://laravel.com/docs/5.0/eloquent#attribute-casting 5.4:https://laravel.com/docs/5.4/eloquent-mutators#attribute-casting

这是我将 eloquent 用于锁定到 PHP 5.4 的遗留应用程序的情况。 出于某种随机原因,我没有试图弄清楚,每个属性都是作为字符串从数据库中检索出来的,而默认的 PHP 转换给我带来了问题。

您的代码将是:

<?php
class City extends Eloquent 
    protected $table = 'cities';
    protected $primaryKey = 'Id';
    protected $casts = [
        'Id' => 'int'
    ];

【讨论】:

直接在模型上的字段非常棒。可悲的是,我无法弄清楚如何在数据透视表上执行此操作。【参考方案2】:

来自数据库的记录中的每个字段都将是一个字符串。

这就是 PHP 中似乎有多少个 db 扩展有效。

Ruby on Rails 保持模式的常量映射以知道 tableA.field1 是一个整数,因此它可以在获取数据库时将任何内容转换为 int。这显然有一些开销,但它可能是一个有用的功能。 Laravel 选择不这样做是为了性能而不是方便。

您可以使用accessors and mutators 手动复制此功能。

【讨论】:

没有某种包/库可以解决这个问题吗? 据我所知,没有。 PHP 是弱类型的,所以 PHP 不在乎。这取决于输出的去向。为了将内容输出到 JSON,我构建了 Fractal,它可以帮助处理各种类型:fractal.thephpleague.com【参考方案3】:

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

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

return gettype($int); // Integer

【讨论】:

是的,我完全确定数据库中的数据类型。也许 Laravel 以某种方式错误地索引了它?如果是这样 - 有没有办法重新运行索引过程?对于单个变量,转换是可以的,但如果我有多个包含各种行的表 - 在我看来,这个解决方案只会让代码看起来很讨厌。

以上是关于Laravel Eloquent ORM:设置模型的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 插入嵌套的 Eloquent ORM 模型

Laravel 数据库操作之Eloquent ORM模型

Laravel系列4.3模型Eloquent ORM的使用

Laravel Eloquent ORM 无法正确返回模型的关系

Laravel系列4.4模型Eloquent ORM的使用

Laravel / Eloquent 模型属性可见性