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

简介: laravel框架中的ORM模型极大的简化了数据库操作,同时也提高了数据操作安全性。 在laravel框架ORM模型中默认会有三个时间字段,created_at,updated_at,deleted_at,这三个时间字段是框架默认操作,不用另加代码去处理,非赏方便: 如: UserModel::c.

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

相关文章
|
Java 测试技术 数据库
【异常】测试自增时数据库报错Springboot-jpa Table ‘sell.hibernate_sequence‘ doesn‘t exist
测试自增时数据库报错Springboot-jpa Table ‘sell.hibernate_sequence‘ doesn‘t exist
84 0
【异常】测试自增时数据库报错Springboot-jpa Table ‘sell.hibernate_sequence‘ doesn‘t exist
|
关系型数据库 MySQL
MySQL:自动维护create_time和update_time字段
通过建表语句设置,让mysql自动维护这两个字段,那么编程的时候也能少写一部分代码
84 0
SAP QM QS41 试图维护Catalog为3的Code Group, 报错-You need to maintain catalog 3 (Usage Decisions) in Customi
SAP QM QS41 试图维护Catalog为3的Code Group, 报错-You need to maintain catalog 3 (Usage Decisions) in Customi
SAP QM QS41 试图维护Catalog为3的Code Group, 报错-You need to maintain catalog 3 (Usage Decisions) in Customi
SAP QM 执行事务代码QA11 报错- Selected set code does not exist, or data entered is incomplete-
SAP QM 执行事务代码QA11 报错- Selected set code does not exist, or data entered is incomplete-
SAP QM 执行事务代码QA11 报错- Selected set code does not exist, or data entered is incomplete-
|
关系型数据库 MySQL 数据库
mysql中的update(更新)与alter(更改)以及 change和modify的区别
mysql中的update(更新)与alter(更改)以及 change和modify的区别
1381 0
如何利用BAPI SD_SALESDOCUMENT_CHANGE修改Sales Order的字段
假设我想修改S/4HANA里Sales Order抬头的Service Date字段SERV_DATE: 首先从数据库表VBKD里查找到SERV_DATE修改之前的值为2020年1月1日
|
PHP
四种Laravel ORM开启created_at的方法
下面由Laravel框架教程栏目给大家介绍Laravel ORM只开启created_at的几种方法,希望对需要的朋友有所帮助! 方法一:
508 0
|
SQL Oracle 关系型数据库
DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS
今天在测试、验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为10.2.0.4.0,AWR的快照是1小时采集一次数据,快照保留14天,也就是二周。
1128 0
|
数据库 数据格式 JSON
Migration 创建 及 字段类型
创建migration 创建dddd表 php artisan make:migration create_table_dddd --create=dddd 创建字段 打开刚才migration出来的表,出现以下内容 Schema::create(...
1331 0