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;
}
我是 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;
}