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

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 грудня, 2024
Використання методу 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, які оптимізують запити до бази даних, зберігаючи при цьому гнучкість включення супутніх даних за необхідності