Функція 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, які оптимізують запити до бази даних, зберігаючи при цьому гнучкість включення супутніх даних за необхідності