laravel中的ORM模型修改created_at,updated_at,deleted_at三个时间字段类型
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三个时间字段类型相关推荐
- 【整理】Laravel中Eloquent ORM 关联关系的操作
Laravel中Eloquent ORM 关联关系的操作 关联数据 定义关联关系 一对一 <?php class User extends Model{// 获取关联到用户的手机public f ...
- Python全栈:Django中的ORM模型
文章目录 1 Django中的ORM模型介绍及配置 2 Django中的ORM模型常见字段类型 CharField DateTimeField 模型的创建 3 Django中的ORM模型同步 migr ...
- mysql——时间字段类型与C#中datetime
一.引言 做项目的时候开始纠结于用2013-01-01 12-12-12存储还是用 2013-01-01存储,这个设计到的问题是mysql中时间字段的选择问题:date.time或者datetime: ...
- Django中的ORM模型
一.Djang的ORM框架 (一)ORM 1.O(objects):类和对象. 2.R(Relation):关系,关系数据库中的表格. 3.M(Mapping):映射. (二)ORM框架功能 1.建立 ...
- php mysql 时间字段_php – MySQL中各种日期/时间字段类型的优...
> TIMESTAMP存储在MySQL专有方法中(尽管它基本上只是一个由年,月,日,小时,分钟和秒组成的字符串),此外,只要插入或更改记录,TIMESTAMP类型的字段就会自动更新.显式字段值给 ...
- Django笔记:ORM模型
Django中操作数据库的方式有两种,一种是使用ORM模型,另一种是直接执行SQL,推荐使用ORM模型的方式来管理数据库,因为当需要执行的数据库操作过多时,第二种方式产生的SQL会非常难于管理和维护, ...
- Django 第十课 1.【ORM模型】
ORM模型介绍 随着项目的越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1:SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL ...
- .Net中的事件处理模型
首先要明确的一点,事件可以看成一个字段,或者一个属性.一个类有一个Event类型的字段,就说明他拥有一个事件,而Event类型需要定义一个委托delegate类型 所以,Net中的事件处理模型可以归纳 ...
- Django中ORM常用字段类型及参数
常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...
最新文章
- 安卓 存储---SharedPreferences
- Android实现双击事件的两种方式
- boost::function30的用法实例
- js分页--存储数据并进行分页
- PC软件开发技术之一:在WinCC中通过VBS操作SQL Server2005
- python获取他人的ip_Python获取指定网段正在使用的IP
- 第一个Sprint冲刺成果
- 1015. vs项目编译成功INSTALL时
- pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值
- Angr安装与使用之使用篇(十八)
- c语言源代码大全迅雷下载,俄罗斯方块C语言源代码
- PrizmDoc HTML5文档查看器和Web API
- 耳机常用降噪技术分析
- cocoscreator摘星星补充-添加结束游戏
- 编程猫海龟编辑器 附使用教程
- sass混合器,选择器的继承
- 【爬虫BUG】‘list‘ object has no attribute ‘text‘
- 智力答题源码php,php儿童智力测评系统
- a commit git 参数是什么意思_Git中的git reset的三种参数的区别
- BestCoder Round #7-A,B,C
热门文章
- 如何以nobody用户执行命令?
- |NOIOJ|动态规划|8462:大盗阿福
- 20150310-删除数组中原有对象
- 楼市反弹难以持续 年末房价稳中趋降
- [Linux 性能检测工具]DF
- 【Java】访问控制
- 2星|《麦肯锡图表工作法》:用图表做商业分析的入门演示
- Web应用程序系统的多用户权限控制设计及实现-总述【1】
- 今天加班做了昨天晚上要写的页面,用到了一些之前用过但还不熟悉需要上网搜索才能用的知识点:...
- Android下的HttpClient的使用(9.11)