З виходом Laravel 11.42 у нас з’явилися корисні методи побудови запитів для роботи з відносними датами. Хоча немає потреби переписувати всі свої програми, ці методи надають зручний і читабельний підхід до роботи з відносними датами у ваших моделях. Розглянемо приклад з моделлю Article
:
Припустимо, ви маєте метод для отримання опублікованих статей певного статусу, де дата published_at
повинна дорівнювати now()
або бути раніше:
use Illuminate\Database\Eloquent\Builder;
use App\Models\Article;
public function scopeActive(): Article|Builder
{
return $this->where('status', ArticleStatus::Published)
->where('published_at', '<=', now());
}
Цей метод можна використовувати в коді для отримання лише активних статей.
Article::with('user', 'category', 'tags')
->active()
->orderByDesc('published_at')
->limit(20)
->get();
Тепер, з Laravel 11.42, ми можемо трохи змінити метод scopeActive()
, використавши новий метод для роботи з відносними датами. Нам потрібно, щоб whereNowOrPast
відповідало нашій оригінальній логіці:
$this->where('status', ArticleStatus::Published)
- ->where('published_at', '<=', now());
+ ->whereNowOrPast('published_at');
Якщо ми хочемо скористатися запитом для знаходження статей зі статусом Published
, які ще не опубліковані, ми можемо використовувати метод whereFuture()
:
$this->where('status', ArticleStatus::Published)
->whereFuture('published_at');
Що, якщо ми хочемо знайти статті до або після сьогоднішньої дати? Нові допоміжні методи для роботи з відносними датами мають варіанти, такі як or
та not
:
$this->whereAfterToday('published_at')
->orWhereBeforeToday('published_at');
Якщо ви бажаєте дізнатися більше про всі нові відносні методи дат, додані до Laravel у версії 11.42, зверніться до Pull Request #54408. Ці методи знаходяться в новому трейті BuildsWhereDateClauses.