我正在使用Laravel 4.2
。
我有两个模型:User
和Video
,这两个模型都有one-to-many relationship
,即User -> HasMany-> Video
。
最近,我要求显示用户列表以及每个用户上传的总视频的文件大小总和,并允许用户按文件大小的升序或降序排列。
我在User
模型中进行了以下更改:
class User extends Eloquent {
protected $hidden = array('videosSum');
protected $appends = array('videos_size');
public function videosSum() {
return $this->hasOne('Video')
->selectRaw('sum(file_size) as sum, user_id')
->groupBy('user_id');
}
public function getVideosSizeAttribute()
{
// if relation is not loaded already, let's do it first
if ( ! array_key_exists('videos_size', $this->relations)){
$this->load('videosSum');
}
$related = $this->getRelation('videosSum');
return $this->attributes['videos_size'] = isset($related->sum) ? (int) $related->sum : 0;
}
}
使用like:
User::where('id', '!=', Auth::user()->id);
我得到了理想的结果。
但问题是,我不希望videos_size
属性到处,User
模型被调用。 我想动态设置。
我尝试了User::$appends = ['videos_size']
,但它提供了 受保护的属性,无法设置超出类错误 。
我还尝试在User
模型中创建一个方法,如果调用它,则设置$appends
,但它也无效。
有人可以帮助我动态启用append属性吗?
答案 0 :(得分:4)
Laravel不支持这一点。 我的朋友和我写了这个延伸: Dynamically hide certain columns when returning an Eloquent object as JSON?
基本上你必须覆盖models.php toArray()方法,因为当你以json或数组形式请求模型时,会计算附加属性。 你可以添加到该链接中的特征并使用它,或者只是将这些方法放在各自的模型类中。
public static function getStaticAppends() {
return self::$_appends;
}
public static function setStaticAppends(array $value) {
self::$_appends = $value;
return self::$_appends;
}
public static function getDefaultAppends() {
return with(new static)->getAppends();
}
public function getAppends(){
return $this->appends;
}
public function toArray() {
if (self::getStaticAppends()) {
$this->appends = self::getStaticAppends();
}
return parent::toArray();
}