2015-01-28 3 views
1

Я новичок в 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; 

Другой способ является статическая функция, которая использует БД:

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

Как правило, вам понадобится статический, если у вас еще нет модели, и нестатический, если у вас есть модель.

Например:

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

// we have user models here 
foreach($users as $user) { 
    $user->hasFullAccount; 
} 
Смежные вопросы