在laravel中,如果你想修改某个字段的显示格式,比如这种情况:数据库表中的字段是 性别 0 或 1 0表示男 1表示女 , 这个时候你查询出来的数据就会显示为0 或者 1,一眼无法让别人分辨出是男还是女,所以为了让别人一眼能知道,就要做些调整,比如在模板中进行判断,
if(sex=='1') echo '男' else echo '女';
这样也是可以的,但会增加模板的复杂性,不利于维护,laravel为我们提供了一种解决方法——访问器,它的作用就是将我们写在模板中的那些判断给分离出来,达到的效果和在模板中写判断是一样的,只不过分离出来了,更加利于维护。
1、访问器写在哪儿?
写在与之对应的模型类中。
2、格式和写法(这里介绍三种写法)
/**
* 数据库字段: is_menu 该字段存的是1或者0 1代表 是 0代表 否
* 访问器 函数的命名规则 get +驼峰命名+ Attribute
* 访问器不仅仅用在 模板调用中的显示,其他地方也可以调用,这里只介绍配合模板的使用
*/
//第一种 在函数中参数传值(框架帮我们做的 传值)
//后两种不通过参数传值,通过其他方式获得值
//第一种 参数传值
//注意事项:驼峰式命名,数据库字段为is_menu 则函数名要改为getISMenuAttribute
//$key 是从数据库取出的值,为1或者0 $key 进行修饰,从而得到我们想要的格式
//在模板中调用显示该字段时,依旧与数据库字段保持相同即可,即使用$item->is_menu
//只是经过访问器的修饰后不会再显示为0或者1了,而是会显示为 是 或者 否
public function getISMenuAttribute($key)
{
//如果取出的$key 为1 则显示 是 否则 显示 否
return $key== "1" ? "<span class="label label-success radius">是</span>" : '<span class="label label-default radius">否</span>';
}
//第二种 不通过参数传值
//在函数名上与第一种没区别,但是 函数没有参数了
//请注意,此时是通过$this->attributes['is_menu']拿到从数据库中取出的值的,而不是像前两种那样通过传参得到的值
//特别注意:若采用与数据库字段相呼应的驼峰式命名函数名,且不传参数的情况下,那么不能通过$this->is_menu获得值,
//会报错ErrorException (E_ERROR)Undefined property:...
//只能通过$this->attributes['is_menu']拿到值
public function getIsMenuAttribute()
{
return $this->attributes['is_menu']."aaa";
}
//第三种 不通过参数传值
//可以自定义名字,如getMenuAttribute
//此时获得值的方式,就有两种了,
//1、$this->attributes['is_menu']
//2、$this->is_menu
//而在模板调用时,则使用$item->menu
public function getMenuAttribute()
{
//return $this->is_menu."bb";
//或者
return $this->attributes['is_menu'].'bb';
}
//总结:函数名命名方式不同,则模板调用时的属性名也不一样,
//当使用参数传值时,要注意 $this->is_menu 的使用前提,
//至于为什么当函数名为getIsMenuAttribute时,不能使用$this->is_menu这种
//方式来获得值,是框架为了安全着想,所以不能同时使用
//至于,到底选用哪种写法,根据需求和自己的喜好,本人推荐采用自定义属性名然后通过$this->is_menu
//或者$this->attributes['is_menu']获得值的方式,这种写法既可以
//得到原有字段的值,还能得到修改后的字段值的格式