laravel中的ORM模型修改created_at,updated_at,deleted。。。

laravel中的ORM模型修改created_at,updated_at,deleted。。。

2023年7月20日发(作者:)

laravel中的ORM模型修改created_at,updated_at,deleted。。。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 中的⼏个⽅法,并且扩展IlluminateDatabaseEloquentSoftDeletingScope类代码如下: trait SoftDelete{ use SoftDeletingTrait; /** * 创建软删除对象 * * @return void */ public static function bootSoftDeletingTrait() { static::addGlobalScope(new SoftDeleteScope); } /** * 只获取软删除的记录 * * @return IlluminateDatabaseEloquentBuilder|static */ public static function onlyTrashed() { $instance = new static; $column = $instance->getQualifiedDeletedAtColumn(); return $instance->newQueryWithoutScope(new SoftDeleteScope)->where($column,'>',new IlluminateDatabaseQueryExpression('0')); } /** * 获取软删除与正常⼀起的记录 * * @return IlluminateDatabaseEloquentBuilder|static */ public static function withTrashed() { return with(new static)->newQueryWithoutScope(new SoftDeleteScope); }}class SoftDeleteScope extends IlluminateDatabaseEloquentSoftDeletingScope{ /** * 只获取正常数据 * * @param IlluminateDatabaseEloquentBuilder $builder * @return void */ public function apply(IlluminateDatabaseEloquentBuilder $builder) { $model = $builder->getModel(); $builder->where($model->getQualifiedDeletedAtColumn(),'=',new IlluminateDatabaseQueryExpression('0')); $this->extend($builder); } /** * 只获取软删除数据 * * @param IlluminateDatabaseEloquentBuilder $builder * @return void */ protected function addOnlyTrashed(IlluminateDatabaseEloquentBuilder $builder) { $builder->macro('onlyTrashed', function(IlluminateDatabaseEloquentBuilder $builder) { $this->remove($builder); $builder->getQuery()->where($builder->getModel()->getQualifiedDeletedAtColumn(),'>',new IlluminateDatabaseQueryExpression('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类型的时间字段

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689824903a288930.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信