php – 在负载上添加一个自定义属性到Laravel/Eloquent模型?

我想能够添加一个自定义属性/属性到Laravel / Eloquent模型加载时,类似于可能通过RedBean’s $ model-> open()方法实现。

例如,目前,在我的控制器我有:

public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}

这将是很高兴能够省略循环并有’available’属性已设置和填充。

我试过使用文档中描述的一些模型事件来附加此属性时,对象加载,但没有成功到目前为止。

笔记:

>’available’不是基础表中的字段。
> $ sessions正作为API的一部分作为JSON对象返回,因此调用模板中的$ session-> available()不是一个选项

最佳答案
问题是由于模型的toArray()方法忽略了与底层表中的列不直接相关的任何访问器的事实。

正如Taylor Otwell提到的here,“这是故意的,出于性能原因。然而,有一个简单的方法来实现这一点:

class EventSession extends Eloquent {

    protected $table = 'sessions';
    protected $appends = array('availability');

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}

$ appends属性中列出的任何属性将自动包含在模型的数组或JSON形式中,前提是您已添加了适当的访问器。

旧答案(Laravel版本< 4.08): 我发现的最好的解决方案是重写toArray()方法和显式设置属性:

class Book extends Eloquent {

    protected $table = 'books';

    public function toArray()
    {
        $array = parent::toArray();
        $array['upper'] = $this->upper;
        return $array;
    }

    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}

或者,如果你有很多自定义访问器,遍历它们并应用它们:

class Book extends Eloquent {

    protected $table = 'books';

    public function toArray()
    {
        $array = parent::toArray();
        foreach ($this->getMutatedAttributes() as $key)
        {
            if ( ! array_key_exists($key, $array)) {
                $array[$key] = $this->{$key};   
            }
        }
        return $array;
    }

    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}

转载注明原文:php – 在负载上添加一个自定义属性到Laravel/Eloquent模型? - 代码日志