cviebrock/eloquent-typecast

用于Eloquent模型强制类型转换检索值的特质

1.0.2 2015-01-12 16:55 UTC

This package is auto-updated.

Last update: 2024-09-05 18:13:59 UTC


README

一个特质,允许Laravel项目的Eloquent模型将属性值转换为原生PHP变量类型。

Latest Stable Version Total Downloads

背景:我为什么需要这个?

对于某些数据库驱动程序,从查询返回的所有属性都作为字符串返回,即使底层列类型是 INTEGERFLOATBOOLEAN

而不是使用这些“看起来像整数的”字符串等,并依赖于PHP的类型转换,这个特质将自动将这些属性值转换为正确的原生PHP变量类型。

如果你正在构建API并且只想返回Eloquent模型的JSON版本,这将非常方便。使用这个特质,所有JSON元素都将适合你的API消费者类型,而不是所有都是字符串,从而在他们的端上节省类型转换。

注意:我相信如果你在PHP安装中使用mysqlnd驱动程序,那么你不需要这个特质,因为mysqlnd会为你处理这个类型转换。你可以通过执行 var_dump($model->getKey()) 来尝试它。如果它显示值是整数,你不需要这个包。如果它显示是字符串,请继续阅读。

安装 & 需求

在你的项目composer.json文件中

"require": {
    "cviebrock/eloquent-typecast": "1.*"
}

在你的项目模型(或你的基础模型)中

use Cviebrock\EloquentTypecast\EloquentTypecastTrait;

class MyModel {

    use EloquentTypecastTrait;

    // Define the attributes you want typecast here
    protected $cast = array(
        'id'         => 'integer',
        'price'      => 'float',
        'is_awesome' => 'boolean'
    );

    ...

}

就是这样。不需要服务提供者或外观。然而,由于它是一个特质,因此你需要运行PHP 5.4或更高版本。

使用方法

每次你请求在 $cast 数组中列出的属性时,它都会从数据库返回的(通常是)字符串转换为指定的原生PHP变量类型。

$cast 数组的键是属性(即列)名称,值是你想要转换到的类型。PHP的 settype() 函数支持的任何内容都有效 ... 尽管将数组、对象或null转换为可能有问题。

如果你将你的模型上的 $castOnSet 属性设置为 true,那么在设置 $cast 数组中的属性之前,将对该值进行类型转换。例如

class MyModel {

    use EloquentTypecastTrait;

    protected $castOnSet = true;

    protected $cast = array(
        'price'      => 'float',
    );

}

$myModel = MyModel::find(1);

$price = Input::get('price');  // this will be a string
$myModel->price = $price;      // the string is cast to a float before setting;

一般来说,这个设置并不是真的必要,因为Laravel和大多数数据库会在保存时为你处理字符串到列类型的转换。然而,也许有一些情况下这很有用,所以为了“功能完善”而添加了它。

注意事项

由于特质的工作方式,你应该确保你的 $cast 数组不包括

  • 关系
  • 你已经有自定义转换器的属性
  • 使用Eloquent的 日期转换

$model->toArray() 也会触发转换。然而,$model->getAttributes() 不会。它返回查询的原始值(甚至不是日期转换)。

错误、建议和贡献

请使用Github来报告错误、评论和建议。

  1. 分叉项目。
  2. 创建你的修复/功能分支并编写你的(注释良好的)代码。
  3. 为你的代码创建单元测试
    • 在根目录下运行composer install --dev以安装所需的测试包。
    • 将您的测试方法添加到eloquent-typecast/tests/TypecastTest.php文件中。
    • 运行vendor/bin/phpunit来执行新(和所有之前的)测试,并确保一切通过。
  4. 提交您的更改(以及您的测试)并推送到您的分支。
  5. 针对develop分支创建一个新的拉取请求。

请注意,您必须针对develop分支创建您的拉取请求。

版权和许可证

Eloquent-Typecast由Colin Viebrock编写,并按照MIT许可证发布。有关详细信息,请参阅LICENSE.md文件。

版权所有 2014 Colin Viebrock