【问题标题】:Laravel get model attribute: difference between two methodsLaravel 获取模型属性:两种方法的区别
【发布时间】:2014-11-20 18:07:21
【问题描述】:

我发现有两种方法可以使用 Laravel 获取/显示模型的属性。我可以在User.php 中创建一个函数,例如:

public function getUsername() {
    return $this->username;
}

然后像这样显示用户名:

{{{ Auth::user()->getUsername() }}}

或者我可以简单地执行此操作而无需创建函数:

{{{ Auth::user()->username }}}

这两种方法有什么区别?

【问题讨论】:

    标签: php laravel model attributes eloquent


    【解决方案1】:

    没有区别。在这种情况下,您会得到完全相同的结果,因此此功能在这种情况下不会有太大帮助。在上述情况下,您只需创建返回字段之一的函数,但您也可以创建返回以逗号分隔的 2 个字段的函数:

    public function getUserAge() {
        return $this->username.', '.$this->age;
    }
    

    然后你可以使用

    {{{ Auth::user()->getUserAge() }}}
    

    在你看来。

    但您也可以为您的模型属性创建 accessor and mutators 以更改您从模型中设置/获取的内容

    【讨论】:

      【解决方案2】:

      几乎没有区别,只是添加一个包装函数以通过属性获取它会增加额外函数调用的开销,这是您不需要的(因此会稍微降低性能)。

      获取一个属性(在您的示例中,只需执行$this->username)最终归结为在Illuminate\Database\Eloquent\Model 中调用此函数:

      /**
       * Dynamically retrieve attributes on the model.
       *
       * @param  string  $key
       * @return mixed
       */
      public function __get($key)
      {
          return $this->getAttribute($key);
      }
      

      完全没有必要用你自己的函数来包装这个函数调用。

      【讨论】:

        【解决方案3】:

        当在这种情况下使用$someObject->username 时,__get() 魔术方法从attributes 数组返回属性,因为username 属性不是对象的公共属性,但它存储在(填充后)@ 987654327@ 数组,当您调用 getUserName() 自定义方法时,该方法正在返回属性,并且间接地发生了同样的事情。所以,你不需要为此使用方法。

        在这两种情况下,都会触发 __get() 魔术方法以从属性数组中返回项目。在PHP 手册上查看Magic Methods

        在某些情况下,您可能需要使用动态 non-existing 属性,例如,如果您有一个 first_namelast_name 字段/属性,并且您希望将这两个名称一起用作 full_name 属性那么在这种情况下,Laravel 提供了一种获取它的好方法。你需要做的就是,创建一个类似的方法:

        public function getFullNameAttribute()
        {
            return $this->first_name . ' ' . $this->last_name;
        }
        

        那么,您可以使用{{ $user->full_name }} 来获取该连接值。

        【讨论】:

        【解决方案4】:

        没有区别,一个是类的 propertyfield,而另一个是同样返回该字段的 getter 方法。这只是 OOP 的常见示例。

        因为它是一个模型对象,如果它们是公共的和受保护的,您可以调用所有模型方法和属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-10
          • 2021-11-19
          • 2016-02-02
          • 1970-01-01
          • 2018-05-18
          • 2023-04-06
          • 1970-01-01
          • 2018-12-18
          相关资源
          最近更新 更多