我希望能够在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()这样的东西是不可取的
如果你将你的getAvailability()方法重命名为getAvailableAttribute(),你的方法就变成了一个访问器,你可以直接在你的模型上使用->来读取它。
文档:https://laravel.com/docs/5.4/eloquent-mutators #器和写值器
EDIT:因为你的属性是“virtual”,所以默认情况下它不包含在对象的JSON表示中。
但我发现这:自定义模型访问器没有处理时->toJson()调用?
为了强制在数组中返回属性,将其作为键添加到$attributes数组中。
class User extends Eloquent {
protected $attributes = array(
'ZipCode' => '',
);
public function getZipCodeAttribute()
{
return ....
}
}
我没有测试它,但是在当前的设置中尝试它应该是非常简单的。
在我的订阅模型中,我需要知道订阅是否暂停。
我是这样做的
public function getIsPausedAttribute() {
$isPaused = false;
if (!$this->is_active) {
$isPaused = true;
}
}
然后在视图模板中,我可以使用
$subscription->is_paused获取结果。
getIsPausedAttribute是设置自定义属性的格式,
并使用is_paused在视图中获取或使用该属性。