在加载时向Laravel / Eloquent模型添加自定义属性?

我希望能够在加载Laravel /

Eloquent模型时为其添加自定义属性/属性,类似于使用RedBean的

$model->open()方法可以实现的那样。

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

public function index()

{

$sessions = EventSession::all();

foreach ($sessions as $i => $session) {

$sessions[$i]->available = $session->getAvailability();

}

return $sessions;

}

能够省略循环并已经设置并填充了“ available”属性将是很好的选择。

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

笔记:

  • “可用”不是基础表中的字段。
  • $sessions是作为JSON对象作为API的一部分返回的,因此$session->available()无法在模板中调用类似内容

回答:

问题是由ModeltoArray()方法忽略所有与基础表中的列不直接相关的访问器而导致的。

正如泰勒·奥特威尔(Taylor

Otwell)在这里提到的:“这是故意的,并且出于性能考虑。”

但是,有一种简单的方法可以实现此目的:

class EventSession extends Eloquent {

protected $table = 'sessions';

protected $appends = array('availability');

public function getAvailabilityAttribute()

{

return $this->calculateAvailability();

}

}

只要您添加了适当的访问器,$ appends属性中列出的所有属性都将自动包含在模型的数组或JSON形式中。

我发现的最佳解决方案是重写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);

}

}

以上是 在加载时向Laravel / Eloquent模型添加自定义属性? 的全部内容, 来源链接: utcz.com/qa/433861.html

回到顶部