Метод 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 надає чіткий і виразний спосіб фільтрації моделей за атрибутами взаємозв'язків, що веде до підтримуванішого коду