Laravel 4: 什么时候使用静态方法?

Laravel 4: When to use static methods?

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

示例 1:

我有如下关系:一个用户有很多collections。现在,我可以这样做:

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

因为我经常与登录的当前用户一起工作,所以我会在控制器或模板中使用它:

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

但是,我也可以采取完全不同的路线并通过我的静态方法调用它 Collection class:

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

然后,我会像这样得到一个用户的所有 collections:

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

示例 2:

我将用户设置存储在名为 UserSettings 的 key-value table 中。因此,我的用户与 UserSetting 具有一对多的关系。如果我想检查一些属性,我可以再走两种方式:

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

函数调用为:

Auth::user()->has_full_account;

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

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());

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

通常,当您还没有模型时,您需要静态,而当您有模型时,您需要非静态。

例如:

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

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