Використання допоміжних функцій відносної дати в Query Builder Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 14 лютого, 2025
З новим оновленням Laravel 11.42 з’явилися корисні методи побудови запитів для роботи з датами, які значно покращують читабельність коду ваших моделей. Чи готові ви дізнатися, як ці нові можливості можуть спростити вашу роботу з датами у проектах? Читайте далі, щоб відкрити для себе світ нових функцій Laravel

З виходом 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.