程序员小助手|3分钟短文:Laravel模型读数据的那个“障眼法”

引言
通过前几篇文章视图和路由的介绍 , 我们通过模型对象操作数据库表 。 laravel模型的精巧设计使得我们操作数据层逻辑更加得心应手 。
程序员小助手|3分钟短文:Laravel模型读数据的那个“障眼法”
文章图片
本文我们来说说模型在读写数据中所使用的技巧 。
日期时间格式化
先从最常用的地方着手 , 比如在迁移文件内使用的timestamps方法 , 就是在表内生成created_at和updated_at两个datetime类型的字段 , 用于标记该记录的创建时间和更新时间 。
laravel框架继承了广泛使用稳定可靠的Carbon类库用于操作日期时间 。 为了测试方便 , 我们不需要写额外的代码 , 直接使用tinker命令行交互工具 , 在命令行输入:
tinker
进入交互界面 , 然后我们使用模型查询一条events表的数据 , 并访问其属性:
namespaceApp;$event=Event::find(1);$event->created_at
打印created_at属性输入内容如下:
=>IlluminateSupportCarbon{#819+''date'':''2020-10-0204:01:38.000000'',+''timezone_type'':3,+''timezone'':''Asia/Shanghai(+08:00)'',}
输出的是一个Carbon对象 。 也可以调用格式化方式返回需要的格式 , 比如返回时间字符串:
$event->created_at->toDateString()//''2020-10-02''
或者自定义格式:
$event->created_at->format('Y-m-dH:i')//''2020-10-0204:01''
在模型内使用该格式化方式很容易 , 添加如下属性定义:
protected$dates=['created_at','updated_at','started_at'];
那么这三个字段都会使用Carbon进行格式化 , 在访问模型对象属性时 , 就会返回该Carbon对象 。
访问器
其实上一节所说的日期时间的格式化 , 正是laravel模型访问器的功能 。 专门用于在模型层面 , 修改模型属性的展示方式 。 定义一个访问器非常简单 , 就是在模型内添加规范格式的方法函数 。 比如想要使用
$model->human_size
而数据库没有这个字段 , 模型也没有这个属性 , 那么使用访问器好了 , 添加如下定义:
publicfuncitongetHumanSizeAttribute(){}
方法内添加要处理的逻辑 , 并返回相应的值即可 。 使用->human_size属性访问 , 就相当于访问了该方法 。
下面是一个相对复杂的方法 , 根据不同情况返回字段name的值:
程序员小助手|3分钟短文:Laravel模型读数据的那个“障眼法”
文章图片
如果在忽略列表 , 就使用纯小写字母 , 如果不是忽略列表的元素 , 首字母大写 。 最后组装为空格间隔的字符串返回 。
在程序内使用->name访问的时候 , 就会调用该方法 。 我们仍然使用tinker进行临时测试:
namespaceApp;$e=newEvent;$e->name=''let'slearnaLittleLaraveltogether'';$e->Save();
这里完成了模型的创建和属性赋值 , 并写入数据库 。 save方法会返回一个Events模型对象 , 直接访问其方法:
$e->name//输出''Let'sLearnaLittleLaravelTogether''
正是我们定义的访问器的修改策略 。
对于已存在的字段属性 , 创建一些常用的访问器方法能提高效率 , 比如知道用户的姓氏和名字 , 我们可以返回其全名 , 模型内创建如下方法:
classUserextendsModel{publicfunctiongetFullnameAttribute(){return$this->first_name.''''.$this->last_name;}}
声明完成时候 , 在代码内使用:
$user=User::find(12);echo$user->fullname;
虽然没有fullname属性 , 可是通过访问器我们获得了类似的能力 。 这是laravel提供的语法糖 , 很好使!
写在最后
本文通过日期时间字段的格式化方法 , 引申出laravel模型的访问器功能 , 并通过实例介绍了具体的用法 。


推荐阅读