Запити до Eloquent-відносин у Laravel з використанням whereRelation

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 25 лютого, 2025
Вам цікаво, як спростити фільтрацію моделей у Laravel, ґрунтуючись на атрибутах їхніх зв'язків? У цій статті ми розглянемо метод `whereRelation`, який робить роботу з фільтрацією простішою, зрозумілішою та ефективнішою.

Метод whereRelation в Laravel спрощує процес фільтрації моделей за атрибутами їхніх взаємозв'язків. Цей елегантний підхід замінює складні підзапити та об'єднання на більш зрозумілий і простий синтаксис.

Ця можливість особливо корисна при створенні складних фільтрів на платформах електронної комерції, в системах управління контентом чи в будь-яких додатках, де моделі взаємопов'язані, і важливо фільтрувати за даними, що стосуються їх.

Post::whereRelation('comments', 'is_approved', true)->get();

Ось приклад створення системи фільтрації курсів:

<?php

namespace App\Http\Controllers;

use App\Models\Course;
use Illuminate\Http\Request;

class CourseController extends Controller
{
    public function browse(Request $request)
    {
        $courses = Course::query();
        
        // Фільтрація за рейтингом викладача
        if ($request->has('top_rated')) {
            $courses->whereRelation('instructor', 'rating', '>=', 4.5);
        }

        // Фільтрація за новими відгуками студентів
        if ($request->has('well_reviewed')) {
            $courses->orWhereRelation('reviews', 'created_at', '>=', now()->subDays(30));
        }

        // Фільтрація за активним обговоренням
        if ($request->has('active_discussion')) {
            $courses->whereRelation('discussions', 'last_activity', '>=', now()->subDays(7));
        }

        return $courses->with(['instructor', 'reviews'])
            ->latest()
            ->paginate();
    }
}

Конструктор запитів створює ефективний SQL запит на основі ваших умов взаємозв'язків:

// Фільтрація курсів з:
// - Високим рейтингом викладачів (4.5 і більше)
// - АБО новими відгуками
// - І активними обговореннями
$courses = Course::whereRelation('instructor', 'rating', '>=', 4.5)
    ->orWhereRelation('reviews', 'created_at', '>=', now()->subDays(30))
    ->whereRelation('discussions', 'last_activity', '>=', now()->subDays(7))
    ->get();

WhereRelation надає чіткий і виразний спосіб фільтрації моделей за атрибутами взаємозв'язків, що веде до підтримуванішого коду