• laravel 访问器报错ErrorException (E_ERROR)Undefined property:...的使用场景、方法和格式详解


     

    在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']获得值的方式,这种写法既可以
        //得到原有字段的值,还能得到修改后的字段值的格式
  • 相关阅读:
    IIS7下设置AD单点登录
    数据库日志学习
    用AOP改善javascript代码
    NOPI使用手册
    数据库相关常用查询语句
    SQL事务+异常
    IIS文件上传大小修改配置说明
    VB&XML的增删改查
    python--多线程&多进程
    python-经典类和新式类区别
  • 原文地址:https://www.cnblogs.com/zqblog1314/p/13454569.html
Copyright © 2020-2023  润新知