关于Laravel-Eloquent的时间处理你中招了吗

    技术2022-07-13  73

    Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。

    默认情况下,Eloquent 预期你的数据表中存在 created_at 和 updated_at 。如果你不想让 Eloquent 自动管理这两个列, 请将模型中的 $timestamps 属性设置为 false:

    <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * 指示模型是否自动维护时间戳 * * @var bool */ public $timestamps = false; }

    以上呢是文档中关于时间戳的记录。 如果设置了 $timestamps=true;会自动向你的数据表中插入created_at和updated_at,但是关于这两个字段,一次偶然的性能分析发现Laravel会有一些额外的处理; 从开发的角度来说,Laravel会默认兼容不是Datetime格式的数据,也就是说每一次insert的时候都默认将这两个字段(如果你不指定其他字段名称的话)转换成Carbon对象,然后再转换为时间格式进行插入操作; 来看下insert和save的源码 关于执行操作的performUpdate和performInsert 都有一段异曲同工的代码 来看看这两个参数: usesTimestamps其实就是返回了我们定义的timestamps,这里默认是true updateTimestamps其实就是更新了定义好的updated_at和created_at 此处freshTimestamp其实就是一个Carbon对象 同样,从数据库默认获取了数据之后,会将这两个字段默认转换为Carbon对象,然后再转换成你需要的。 下面是框架源码的截图 1.toArray方法 2.toArray中的attributesToArray() 3.关于addDateAttributesToArray

    总结来说就是,不管是创建还是读取都是有一步carbon对象到字符串的转换和对象的实例化,数据量大的情况下开销相应也会增加,如果说你自己的程序不需要这些转换,可以将时间格式的工作量放到数据库里面而不是在框架层面做这个事情,也必定会节约一些开销。 自己权衡吧~

    Processed: 0.049, SQL: 9