Запросы по связям в Eloquent с помощью whereRelation в Laravel
Метод whereRelation в Laravel упрощает процесс фильтрации моделей на основе атрибутов их связей. Этот элегантный подход заменяет сложные подзапросы и JOIN, делая код более читаемым и поддерживаемым.
Эта функция особенно полезна при создании сложных фильтров в e-commerce платформах, CMS или любых приложениях, где модели взаимосвязаны, и фильтрация по связанным данным играет ключевую роль.
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 предоставляет чистый и выразительный способ фильтрации моделей на основе атрибутов их связей, что делает код более поддерживаемым и удобочитаемым.
Последнее обновление 24.02.2025