Как (и где) зарегистрировать пользовательский метод запроса в Laravel

В моем приложении мне нужно было найти пользователей, которые были зарегистрированы за последние 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), Но я не знаю, где его поставить и как …

2

Решение

Существует также возможность макроса метода в построителе запросов:

\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 метод.

3

Другие решения

Для многоразового кода у вас есть 2 варианта:

  1. создайте базовую модель и сделайте так, чтобы все другие модели расширялись от этой базовой модели (эта модель должна расширяться от модели Eloquent)
  2. создать черту и использовать эту черту во всех моделях, которые действительно нуждаются в ней.

В этом нет большой разницы, но лучше создать несколько признаков с одинаковым набором функций, а не создавать один большой класс с несколькими повторно используемыми методами.

Конечно, вы также можете смешать это, так что вы можете поместить метод в черту и использовать эту черту в базовой модели и заставить все модели расширяться от этой базовой модели.

2

По вопросам рекламы [email protected]