В моем приложении мне нужно было найти пользователей, которые были зарегистрированы за последние 7 дней. Позже я понял, что мне также нужно проверить на 30 дней и 365 дней и так далее. Поэтому я написал область запроса в моем User.php:
public function scopeCreatedWithinDays($query,$day){
$str = $day.' days ago';
$carbon = new Carbon($str);
$query->where('created_at', '>=', $carbon);
}
И я вдруг понял, что этот метод является хорошим кандидатом для многократного использования во всех моделях. Поэтому мне нужно определить этот метод в общем месте, чтобы я мог легко получить строки, созданные в последнем x
дней просто позвонив $anyModel->createdWithinDays(30)
, Но я не знаю, где его поставить и как …
Существует также возможность макроса метода в построителе запросов:
\Illuminate\Database\Query\Builder::macro('createdWithinDays', function ($day) {
return $this->where('created_at', '>=', new \Carbon\Carbon($day .' days ago'));
});
Теперь этот метод должен быть доступен для любых запросов, связанных с Query Builder, который включает все запросы Eloquent.
Нет наследования, нет признаков, никаких изменений в любых моделях, и у вас есть этот метод для использования с DB::
также.
AnyModel::createdWithinDays(4)->get();
DB::table('blah')->createdWithinDays(4)->get();
Извините … часть ‘и где’: добавьте макрос в сервис-провайдер boot
метод.
Для многоразового кода у вас есть 2 варианта:
В этом нет большой разницы, но лучше создать несколько признаков с одинаковым набором функций, а не создавать один большой класс с несколькими повторно используемыми методами.
Конечно, вы также можете смешать это, так что вы можете поместить метод в черту и использовать эту черту в базовой модели и заставить все модели расширяться от этой базовой модели.