我希望能够在Laravel/Eloquent模型加载时添加一个自定义属性/属性,类似于如何使用RedBean的$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()这样的东西是不可取的


当前回答

在我的订阅模型中,我需要知道订阅是否暂停。 我是这样做的

public function getIsPausedAttribute() {
    $isPaused = false;
    if (!$this->is_active) {
        $isPaused = true;
    }
}

然后在视图模板中,我可以使用 $subscription->is_paused获取结果。

getIsPausedAttribute是设置自定义属性的格式,

并使用is_paused在视图中获取或使用该属性。

其他回答

在我的例子中,创建一个空列并设置其访问器工作得很好。 我的访问器填充用户的年龄从dob列。toArray()函数也可以工作。

public function getAgeAttribute()
{
  return Carbon::createFromFormat('Y-m-d', $this->attributes['dateofbirth'])->age;
}

我有类似的东西: 在我的模型中有一个属性图片,它包含了存储文件夹中文件的位置。 图像必须返回base64编码

//Add extra attribute
protected $attributes = ['picture_data'];

//Make it available in the json response
protected $appends = ['picture_data'];

//implement the attribute
public function getPictureDataAttribute()
{
    $file = Storage::get($this->picture);
    $type = Storage::mimeType($this->picture);
    return "data:" . $type . ";base64," . base64_encode($file);
}

你可以在Model中使用setAttribute函数来添加一个自定义属性

在我的订阅模型中,我需要知道订阅是否暂停。 我是这样做的

public function getIsPausedAttribute() {
    $isPaused = false;
    if (!$this->is_active) {
        $isPaused = true;
    }
}

然后在视图模板中,我可以使用 $subscription->is_paused获取结果。

getIsPausedAttribute是设置自定义属性的格式,

并使用is_paused在视图中获取或使用该属性。

Laravel Eloquent文档页上的最后一件事是:

protected $appends = array('is_admin');

它可以自动用于向模型添加新的访问器,而不需要任何额外的工作,如修改::toArray()等方法。

只需创建getFooBarAttribute(…)访问器,并将foo_bar添加到$ appendds数组。