Оптимізація продуктивності в Laravel за допомогою умовного завантаження зв'язків через `whenLoaded`

2
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 грудня, 2025
Використання методу whenLoaded() у Laravel дозволяє умовно активувати дані зв'язків у відповідях API, що оптимізує продуктивність і запобігає зайвим запитам до бази даних. Дізнайтеся, як реалізувати цю функцію та підвищити ефективність ваших API в нашій статті!

Функція API Resources у Laravel whenLoaded() дозволяє умовно включати дані зв'язків у API-відповіді, оптимізуючи продуктивність шляхом запобігання зайвим запитам до бази даних

Ось приклад використання методу whenLoaded():

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'posts' => PostResource::collection($this->whenLoaded('posts'))
        ];
    }
}

Якщо зв'язок "posts" не завантажено, ключ "posts" буде видалено з відповіді, залишаючи лише "id" та "name"

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

<?php

namespace App\Http\Controllers;

use App\Models\Article;
use App\Http\Resources\ArticleResource;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    public function index(Request $request)
    {
        $query = Article::query();

        if ($request->boolean('with_author')) {
            $query->with('author');
        }

        if ($request->boolean('with_comments')) {
            $query->with(['comments' => fn($query) => $query->latest()]);
        }

        return ArticleResource::collection($query->paginate());
    }
}

class ArticleResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'content' => $this->content,
            'author' => new UserResource($this->whenLoaded('author')),
            'comments' => CommentResource::collection(
                $this->whenLoaded('comments')
            ),
            'latest_comment' => $this->whenLoaded('comments', function() {
                return new CommentResource($this->comments->first());
            })
        ];
    }
}

Ця реалізація демонструє ефективне управління зв'язками завдяки:

Використання whenLoaded() сприяє створенню легких і ефективних API, які оптимізують запити до бази даних, зберігаючи при цьому гнучкість включення супутніх даних за необхідності

Популярні

Logomark Logotype

Випущено Livewire 3.6

Laravel Livewire випустив нову версію 3.6, яка приносить з собою цікаві HTML-директиви для управління видимістю DOM-елементів і JavaScript-діями. Досліджуйте нові можливості Livewire, що допоможуть вам створити ще більш інтерактивні користувацькі інтерфейси!

Logomark Logotype

Що нового в PHP 8.5

PHP 8.5 обіцяє безліч нових можливостей, таких як оператор Pipe, функції `array_first()` та `array_last()`, а також нове розширення URI. Чи готові ви дізнатися, як ці функції можуть спростити вашу розробку? Читайте далі, щоб дізнатися більше про ці захоплюючі нововведення

Logomark Logotype

"SQLSTATE[HY000] [2002] Connection refused" у Laravel в GitHub Actions

Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!