Laravel Eloquent ORM:设置模型的数据类型
Posted
技术标签:
【中文标题】Laravel Eloquent ORM:设置模型的数据类型【英文标题】:Laravels Eloquent ORM: setting datatypes of the model 【发布时间】:2014-08-23 01:32:04 【问题描述】:目前我有一个包含两行的简单表格:id
和 key
。
每当我尝试使用 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
,可用于提示每个模型属性的类型。
这是我将 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:设置模型的数据类型的主要内容,如果未能解决你的问题,请参考以下文章