我是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());
所以,我猜这两种方式都是合法的,两种方式都能产生正确的结果,但是什么时候以静态的方式使用模型类?何时通常对对象本身进行操作?
答案 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;
}