Динамічна завантаження відносин у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 27 лютого, 2025
Метод loadMissing у Laravel відкриває нові можливості для ефективного завантаження зв’язків моделей, запобігаючи проблемам з N+1 запитами. Чи готові ви дізнатися, як оптимізувати свої API та інформаційні панелі за допомогою цієї гнучкої функції? Читайте далі

Метод loadMissing у Laravel забезпечує гнучке завантаження відносин для існуючих моделей або колекцій. Цей підхід дозволяє уникнути проблеми з N+1 запитами та завантажувати відносини лише за необхідності.

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

$post->loadMissing(['comments', 'author']);
// З обмеженнями
$post->loadMissing(['comments' => function($query) {
    $query->latest()->take(5);
}]);

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

<?php
 
namespace App\Http\Controllers;
 
use App\Models\Dashboard;
use Illuminate\Http\Request;
 
class DashboardController extends Controller
{
    public function show(Request $request, Dashboard $dashboard)
    {
        // Завантаження основних відносин
        $dashboard->loadMissing([
            'widgets',
            'owner',
        ]);
 
        // Умовне завантаження додаткових даних
        if ($request->section === 'analytics') {
            $dashboard->loadMissing([
                'widgets.viewHistory' => function($query) {
                    $query->whereBetween('viewed_at', [
                        now()->subDays(30),
                        now()
                    ]);
                },
                'widgets.interactions'
            ]);
        }
 
        if ($request->section === 'sharing') {
            $dashboard->loadMissing([
                'sharedUsers',
                'shareLinks' => function($query) {
                    $query->where('expires_at', '>', now());
                }
            ]);
        }
        return $dashboard;
    }
}

Метод loadMissing розумно завантажує лише необхідні відносини:

// GET /dashboard/1?section=analytics
{
    "id": 1,
    "name": "Огляд продажів",
    "widgets": [
        {
            "id": 1,
            "type": "графік",
            "viewHistory": [
                {
                    "viewed_at": "2024-02-01T10:30:00Z",
                    "views": 150
                }
            ],
            "interactions": [
                {
                    "type": "зміна_фільтра",
                    "timestamp": "2024-02-01T11:20:00Z"
                }
            ]
        }
    ]
}

loadMissing забезпечує ефективний спосіб управління завантаженням відносин, оптимізуючи запити до бази даних і зберігаючи гнучкість коду