laravel框架中的ORM模型极大的简化了数据库操作,同时也提高了数据操作安全性。

在laravel框架ORM模型中默认会有三个时间字段,created_at,updated_at,deleted_at,这三个时间字段是框架默认操作,不用另加代码去处理,非赏方便:

如: UserModel::create($insert); ORM模型会自动添加上create_at字段但写入当前时间,而不用我们自己去添加这个字段,在修改时会加上updated_at,

在删除时laravel框架提供两种模式,一个是正常删除,一个是软删除,

正常删除会直接删除数据库里的记录,同样我们也不用为表创建deleted_at字段,

当使用软删除时,框架不会直接删除数据库里的数据,而是直接写deleted_at指定当前删除时间。

注意:当laravel使用了软删除,在每次正常查询时都会添加一个deleted_at is null 的条件,以去掉删除的记录,当前要取出删除的记录则要 UserModel::onlyTrashed()->get();

ORM在开发中方便了数据操作,只是在laravel框架中默认的ORM模型这三个时间字段的数据类型是datetime型,而且在软删除模式中deleted_at必须允许为NULL,更要命的是如果我们修改了字段类型为int型时deleted_at字段也必须允许为NULL,否则软删除会出现无法正常取数据,因为在使用软删除时框架默认添加的条件是deleted_at is NULL为正常数据,在一些数据量大的表中一般时间字段会使用int型,而如果允许为NULL则会影响索引的命中。

具体的修改有:

/**
  * 指定时间字符
  *
  * @param  \DateTime|int  $value
  * @return string
  */
    public function fromDateTime($value)
    {
        return strtotime(parent::fromDateTime($value));
    }

以上代码是修改字段写入数据库的数据类型为int

如果这个时候我们想修改这三个字段的名称可以在对应的MODEL类中添加以下代码

const DELETED_AT='delete_at';
const UPDATED_AT='update_at';
const CREATED_AT = 'create_at';

以上处理只能是在没有使用软删除时正常工作,如果使用了软删除则必须重写 SoftDeletingTrait 中的几个方法,并且扩展Illuminate\Database\Eloquent\SoftDeletingScope类

代码如下:

trait SoftDelete{
    use SoftDeletingTrait;
    /**
  * 创建软删除对象
  *
  * @return void
  */
 public static function bootSoftDeletingTrait()
 {
  static::addGlobalScope(new SoftDeleteScope);
 }
    /**
  * 只获取软删除的记录
  *
  * @return \Illuminate\Database\Eloquent\Builder|static
  */
 public static function onlyTrashed()
 {
  $instance = new static;

$column = $instance->getQualifiedDeletedAtColumn();

return $instance->newQueryWithoutScope(new SoftDeleteScope)->where($column,'>',new Illuminate\Database\Query\Expression('0'));
 }
    /**
  * 获取软删除与正常一起的记录
  *
  * @return \Illuminate\Database\Eloquent\Builder|static
  */
 public static function withTrashed()
 {
  return with(new static)->newQueryWithoutScope(new SoftDeleteScope);
 }
}

class SoftDeleteScope extends Illuminate\Database\Eloquent\SoftDeletingScope{
    /**
  * 只获取正常数据
  *
  * @param  \Illuminate\Database\Eloquent\Builder  $builder
  * @return void
  */
 public function apply(Illuminate\Database\Eloquent\Builder $builder)
 {
  $model = $builder->getModel();

$builder->where($model->getQualifiedDeletedAtColumn(),'=',new Illuminate\Database\Query\Expression('0'));

$this->extend($builder);
 }
    /**
  * 只获取软删除数据
  *
  * @param  \Illuminate\Database\Eloquent\Builder  $builder
  * @return void
  */
 protected function addOnlyTrashed(Illuminate\Database\Eloquent\Builder $builder)
 {
  $builder->macro('onlyTrashed', function(Illuminate\Database\Eloquent\Builder $builder)
  {
   $this->remove($builder);

$builder->getQuery()->where($builder->getModel()->getQualifiedDeletedAtColumn(),'>',new Illuminate\Database\Query\Expression('0'));

return $builder;
  });
 }
    /**
  * 去掉软删除条件
  *
  * @param  array   $where
  * @param  string  $column
  * @return bool
  */
 protected function isSoftDeleteConstraint(array $where, $column)
 {
  return $where['type'] == 'Basic' && $where['operator']=='=' && $where['value']=='0' && $where['column'] == $column;
 }
}

说明:

SoftDelete 是重写 SoftDeletingTrait 中的部分方法,只要我们创建的MODEL使用了 use SoftDelete;

就能把原来的deleted_at字段完全修改为int类型,并且不允许为null。

SoftDeleteScope类只是为了修改在软删除时添加的deleted_at is null的条件。

到这里只要我们创建的MODEL继承于Eloquent并且在类中添加use SoftDelete;重写fromDateTime方法就可以使用int类型的时间字段

当然也可以在Eloquent与Model中间再添加一个类用于重写fromDateTime方法,可以实现所有的model都使用int类型的时间字段

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1536854

laravel中的ORM模型修改created_at,updated_at,deleted_at三个时间字段类型相关推荐

  1. 【整理】Laravel中Eloquent ORM 关联关系的操作

    Laravel中Eloquent ORM 关联关系的操作 关联数据 定义关联关系 一对一 <?php class User extends Model{// 获取关联到用户的手机public f ...

  2. Python全栈:Django中的ORM模型

    文章目录 1 Django中的ORM模型介绍及配置 2 Django中的ORM模型常见字段类型 CharField DateTimeField 模型的创建 3 Django中的ORM模型同步 migr ...

  3. mysql——时间字段类型与C#中datetime

    一.引言 做项目的时候开始纠结于用2013-01-01 12-12-12存储还是用 2013-01-01存储,这个设计到的问题是mysql中时间字段的选择问题:date.time或者datetime: ...

  4. Django中的ORM模型

    一.Djang的ORM框架 (一)ORM 1.O(objects):类和对象. 2.R(Relation):关系,关系数据库中的表格. 3.M(Mapping):映射. (二)ORM框架功能 1.建立 ...

  5. php mysql 时间字段_php – MySQL中各种日期/时间字段类型的优...

    > TIMESTAMP存储在MySQL专有方法中(尽管它基本上只是一个由年,月,日,小时,分钟和秒组成的字符串),此外,只要插入或更改记录,TIMESTAMP类型的字段就会自动更新.显式字段值给 ...

  6. Django笔记:ORM模型

    Django中操作数据库的方式有两种,一种是使用ORM模型,另一种是直接执行SQL,推荐使用ORM模型的方式来管理数据库,因为当需要执行的数据库操作过多时,第二种方式产生的SQL会非常难于管理和维护, ...

  7. Django 第十课 1.【ORM模型】

    ORM模型介绍 随着项目的越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1:SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL ...

  8. .Net中的事件处理模型

    首先要明确的一点,事件可以看成一个字段,或者一个属性.一个类有一个Event类型的字段,就说明他拥有一个事件,而Event类型需要定义一个委托delegate类型 所以,Net中的事件处理模型可以归纳 ...

  9. Django中ORM常用字段类型及参数

    常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...

最新文章

  1. 安卓 存储---SharedPreferences
  2. Android实现双击事件的两种方式
  3. boost::function30的用法实例
  4. js分页--存储数据并进行分页
  5. PC软件开发技术之一:在WinCC中通过VBS操作SQL Server2005
  6. python获取他人的ip_Python获取指定网段正在使用的IP
  7. 第一个Sprint冲刺成果
  8. 1015. vs项目编译成功INSTALL时
  9. pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值
  10. Angr安装与使用之使用篇(十八)
  11. c语言源代码大全迅雷下载,俄罗斯方块C语言源代码
  12. PrizmDoc HTML5文档查看器和Web API
  13. 耳机常用降噪技术分析
  14. cocoscreator摘星星补充-添加结束游戏
  15. 编程猫海龟编辑器 附使用教程
  16. sass混合器,选择器的继承
  17. 【爬虫BUG】‘list‘ object has no attribute ‘text‘
  18. 智力答题源码php,php儿童智力测评系统
  19. a commit git 参数是什么意思_Git中的git reset的三种参数的区别
  20. BestCoder Round #7-A,B,C

热门文章

  1. 如何以nobody用户执行命令?
  2. |NOIOJ|动态规划|8462:大盗阿福
  3. 20150310-删除数组中原有对象
  4. 楼市反弹难以持续 年末房价稳中趋降
  5. [Linux 性能检测工具]DF
  6. 【Java】访问控制
  7. 2星|《麦肯锡图表工作法》:用图表做商业分析的入门演示
  8. Web应用程序系统的多用户权限控制设计及实现-总述【1】
  9. 今天加班做了昨天晚上要写的页面,用到了一些之前用过但还不熟悉需要上网搜索才能用的知识点:...
  10. Android下的HttpClient的使用(9.11)