Laravel 4.1 eloquent模型集动态附加

时间:2015-09-28 07:30:03

标签: laravel

我正在使用Laravel 4.2

我有两个模型:UserVideo,这两个模型都有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属性吗?

1 个答案:

答案 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();
}