Laravel-admin实现时间戳和自定义日期的自动转换

简介: 今天介绍我在使用laravel-admin遇到的坑,我数据库存储的时间是int类型的时间戳,需要在管理后台展示日期怎么优雅的实现呢?

基于cast实现了类型的自动转换。


需求分析


我们需要开发活动管理,活动有开始时间和结束时间,数据库对时间统一使用int时间戳进行处理。

但是管理后台需要展示给管理员“年月日-时分秒”这类数据。


考虑到后续模块还会有这种需求,为了提高程序复用性,我不打算每个模块都CV代码,调研如何进行封装抽取,来实现类型的自动转化。


cast就是比较好的选择


下面开始上代码


代码实现


自定义基类model:


我定义了CustomModel作为我的基类model,各模块的model层都会继承CustomModel

定义castAttribute方法,所有需要类型转换的方法都会执行到这里

自定义属性custom_date,返回return date('Y-m-d', intval($value));

当我需要返回指定格式的日期时,我就在对应的model,设置属性为custom_date就可以了。


<?php
namespace App\Model;
use App\Library\Utility;
use Illuminate\Database\Eloquent\Model;
class CustomModel extends Model
{
    .
    .
    .
    protected function castAttribute($key, $value)
    {
        switch ($this->getCastType($key)) {
            case 'int':
            case 'integer':
                return (int)$value;
            case 'real':
            case 'float':
            case 'double':
                return $this->fromFloat($value);
            case 'decimal':
                return $this->asDecimal($value, explode(':', $this->getCasts()[$key], 2)[1]);
            case 'string':
                return (string)$value;
            case 'bool':
            case 'boolean':
                return (bool)$value;
            case 'object':
                return $this->fromJson($value, true);
            case 'array':
            case 'json':
                return $this->fromJson($value);
            case 'collection':
                return new BaseCollection($this->fromJson($value));
            case 'date':
                return $this->asDate($value);
            case 'datetime':
            case 'custom_datetime':
                return $this->asDateTime($value);
            case 'timestamp':
                return $this->asTimestamp($value);
            case 'geom':
                return Utility::decodePoint($value);
            case 'carray':
                return empty($value) ? [] : $this->fromJson($value);
            case 'not_empty':
                return empty($value) ? '[为空]' : $value;
                //定义自己的date格式
            case 'custom_date':
                return date('Y-m-d', intval($value));
            default:
                return $value;
        }
    }
}


我们接着往下看


模块model层


需要使用时间戳转日期的model 设置$casts

注意:只有在model中设置了$casts,才会执行上面CustomModel中定义的类型转化函数castAttribute


特殊说明


下面的setStartTimeAttribute和int时间戳自动转成日期进行展示没有关系。

setStartTimeAttribute的作用是:保存时输入的日期字符串自动转成时间戳。

这样我们就智能的实现了时间戳和日期字符转的自动转换。


<?php
namespace App\Model\House;
class HouseGroupInfo extends CustomModel
{
    protected $table = 'xxxx';
    protected $primaryKey = 'id';
    protected $connection = 'xxxx';
    protected $keyType = 'int';
    public $incrementing = true;
    protected $casts = [
        'endTime'   => 'custom_date',
        'startTime' => 'custom_date'
    ];
    //设置setXXXAttribute方法,查看源码得知的,作用是:保存时输入的日期字符串转时间戳。
    public function setStartTimeAttribute($value)
    {
        $this->attributes['startTime'] = strtotime($value);
    }
    public function setEndTimeAttribute($value)
    {
        $this->attributes['endTime'] = strtotime($value);
    }
}


Controller层


<?php
namespace App\Admin\Controllers;
.
.
.
class HouseGroupController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = 'myTitle';
    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new HouseGroupInfo());
        $grid->model()->orderBy('id', 'desc');
        .
        .
        .
        $grid->column('startTime', '开始日期');
        $grid->column('endTime', '结束日期');
        $grid->column('createtime', '创建时间')->formatTimestamp();
        $grid->actions(function ($actions) {
            // 去掉删除
            $actions->disableDelete();
        });
        return $grid;
    }
    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(HouseGroupInfo::findOrFail($id));
        return $show;
    }
    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new HouseGroupInfo());
        $form->date('startTime', '活动开始日期')->format('YYYY-MM-DD')->width(200);
        $form->date('endTime', '活动结束日期')->format('YYYY-MM-DD')->width(200);
        $form->text('code', '邀请码')->rules("required|max:50");
        $form->saving(function (Form $form) {
            //保存前的操作 钩子函数
            if ($form->code) {
            }
        });
        //保存后的操作:钩子函数
        $form->saved(function (Form $form) {
        });
        return $form;
    }
}


小坑分享


注意:下面截图的set方式是设置值,xxx = yyy;

而不是return出去值,只有get方法才是return。


微信图片_20221112131050.jpg


总结


这样我们就实现了基于Laravel的cast特性,实现了时间戳和自定义日期的自动转换。

相关文章
|
4月前
|
JavaScript 前端开发
QML中的Date将时间戳和指定格式时间互转
QML中的Date将时间戳和指定格式时间互转
89 0
|
7月前
|
关系型数据库 MySQL Java
mysql数据库处理TIMESTAMP格式日期
该内容提到了关于MySQL数据库处理TIMESTAMP格式日期的解决方案。首先,引用了两篇CSDN博客文章,一篇是关于使用MyBatis在MySQL中添加或修改TIMESTAMP日期的,另一篇是关于将Oracle的TIMESTAMP字段通过MyBatis插入到数据库的。接着,提到一个错误信息,说明MySQL表中不能有多个TIMESTAMP列。然后,展示了如何设置数据库字段(ctime和mtime)自动记录创建和更新时间,并提供了对应的mapper文件和Java字段定义,以实现业务代码中无需手动设置这些时间戳。
112 2
|
JavaScript
Vue禁止选择以后的日期或者默认显示某个日期
Vue禁止选择以后的日期或者默认显示某个日期
97 0
|
JSON 前端开发 数据格式
全局日期请求转换处理
全局日期请求转换处理
78 0
|
前端开发 数据库
后端数据库中返回date日期时 前端显示为一串数字
后端数据库中返回date日期时 前端显示为一串数字
|
PHP
PHP日期时间运用十一:三种方法比较两个指定的日期
在之前的文章《PHP日期时间运用十:将秒数转成格式为“天时分秒”》中给大家介绍了怎么将秒数转成格式为“天时分秒”,那么本文继续开始PHP日期时间系列的文章~ 正如标题所述,本文主要内容是给大家介绍比较两个指定日期的三种方法! 假设我们给定两个日期(date1 和 date2),当两个日期的格式相同时,在 PHP 中比较这两个日期是很简单的,但是当两个日期的格式不同时就会出现一些问题。
458 0
|
JavaScript 前端开发 关系型数据库
eggjs 查询 mysql 返回年月日里包含YYYY-MM-DDT16:00:00.000Z怎么处理?
eggjs 查询 mysql 返回年月日里包含YYYY-MM-DDT16:00:00.000Z怎么处理?
175 0
eggjs 查询 mysql 返回年月日里包含YYYY-MM-DDT16:00:00.000Z怎么处理?
|
PHP
PHP:laravel日期序列化自定义默认日期格式
PHP:laravel日期序列化自定义默认日期格式
229 0
|
SQL 前端开发 fastjson
使用 fastjson 转换 Date 格式的数据,默认是时间戳,更改为 年-月-日 的方法
使用 fastjson 转换 Date 格式的数据,默认是时间戳,更改为 年-月-日 的方法
1484 0
|
存储 SQL 前端开发
解决方案:记录一下Date类型在传值时遇见的若干坑(String类型转为Date类型、mysql的表设置、UTC的设置)
解决方案:记录一下Date类型在传值时遇见的若干坑(String类型转为Date类型、mysql的表设置、UTC的设置)
解决方案:记录一下Date类型在传值时遇见的若干坑(String类型转为Date类型、mysql的表设置、UTC的设置)