Laravel 4:何时使用静态方法?

时间:2015-01-28 16:19:42

标签: php laravel-4

我是Laravel 4的新手,我想知道何时使用静态方法以及何时使用自定义属性访问器。这可能是一个哲学问题,但我想更多地了解这两种方法的优缺点。

示例1:

我有以下关系:用户有很多集合。现在,我可以这样做:

class User extends Eloquent {
    ....
    public function collections() {
        return $this->hasMany('Collection')->orderBy('order_nr', 'ASC');
    }
}

由于我与当前登录的用户合作很多,我在控制器或模板中使用它是这样的:

$collections = Auth::user()->collections()->get();

但是,我也可以采用整个不同的路径并通过我的Collection类的静态方法调用它:

class Collection extends Eloquent { 
    public function scopeOfUser($query, $user_id) {
        return $query->where('user_id', '=', $user_id)->orderBy('order_nr', 'ASC');
    }
}

然后,我得到像这样的用户的所有集合:

$collections = Collection::ofUser(Auth::id())->get();

示例2:

我将用户设置存储在名为UserSettings的键值表中。因此,我的用户与UserSetting有一对多的关系。如果我想检查一些属性,我可以再次采取两种方式:

class User extends Eloquent {
    public function getHasFullAccountAttribute() {
        return $this->hasMany('UserSetting')->whereKey('account_type')->whereValue('full')->count() > 0;
    }
}

函数调用将是:

Auth::user()->has_full_account;

其他方式是使用DB的静态函数:

class User extends Eloquent {
    public static function hasFullAccount($user_id) {
        return DB::table('users')
            ->join('user_settings', 'users.id', '=', 'user_settings.user_id')
            ->where('user_settings.key', '=', 'account_type')
            ->where('user_settings.value', '=', 'full')
            ->where('users.id', '=', $user_id)
            ->count() > 0;
    }
}

接着是电话:

User::hasFullAccount(Auth::id());

所以,我猜这两种方式都是合法的,两种方式都能产生正确的结果,但是什么时候以静态的方式使用模型类?何时通常对对象本身进行操作?

1 个答案:

答案 0 :(得分:1)

通常情况下,当您还没有模型时,您需要静态,而当您拥有模型时,则需要非静态。

例如:

// we don't already have a user model here
User::hasFullAccount(12345);

// we have user models here
foreach($users as $user) {
   $user->hasFullAccount;
}