Laracode
Laracode

Запросы по связям в 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