Laravel获取模型属性:两种方法之间的差异

时间:2014-09-25 20:29:08

标签: php laravel model attributes eloquent

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

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

然后显示如下的用户名:

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

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

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

这两种方法有什么区别?

4 个答案:

答案 0 :(得分:5)

在这种情况下使用$someObject->username时,__get()魔术方法会从attributes数组返回属性,因为username属性不是对象的公共属性,但它& #39;在attributes数组中存储(填充后),当您调用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 }}来获取该连接值。

答案 1 :(得分:3)

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

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

然后你可以使用

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

在你看来。

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

答案 2 :(得分:3)

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

获取一个属性(在你的例子中只做$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 :(得分:1)

没有区别是类的属性字段,而其他是getter方法也会返回该字段。这只是OOP的常见例子。

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