Laravel 4.1 Eloquent模型动态设置appends

3
我正在使用 Laravel 4.2。
我有两个模型:User 和 Video,这两个模型都具有一对多关系,即 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;
    }
}

使用方法如下:

User::where('id', '!=', Auth::user()->id);

我得到了想要的结果。

但问题是,我不希望在调用User模型时到处都有videos_size属性。 我想要动态设置它。

我尝试过 User::$appends = ['videos_size'] 但它会出现无法在类外部设置受保护属性的错误

我还尝试在User模型中创建一个方法,如果被调用就设置$appends,但也没有效果。

有人能帮我如何动态启用 appends 属性吗?


有没有 Laravel 的专家可用? - Dev
你尝试过将 appends 设置为 public 然后进行更改吗? - cre8
我不确定是否可能,让我检查一下。 - Dev
1个回答

4
Laravel不支持这个功能。 我的朋友和我编写了这个扩展程序: Dynamically hide certain columns when returning an Eloquent object as JSON? 基本上,您需要覆盖models.php中的toArray()方法,因为当您以json或数组形式要求模型时,添加的属性会被计算出来。 您可以添加到该链接中的trait并使用它,也可以将这些方法放在各自的model类中。
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接