Skip to content

Ресурсы JSON:API ​

В Laravel 12 и 13 есть Illuminate\Http\Resources\JsonApi\JsonApiResource. Пакет работает с ним и добавляет одно исправление для суженных select.

Строгие модели и разреженные наборы полей ​

JsonApiResource Laravel читает каждый перечисленный атрибут до того, как применит fields[<type>]. С Model::preventAccessingMissingAttributes() (или Model::shouldBeStrict()) модель, загруженная с суженным SELECT, тогда бросает MissingAttributeException.

Наследуйтесь вместо этого от MyProgs\QueryBuilder\Resources\JsonApiResource или подключите его трейт MyProgs\QueryBuilder\Resources\LazyAttributes в свой базовый ресурс: атрибут, перечисленный по имени, тогда читается, только если ответ его оставляет.

php
use MyProgs\QueryBuilder\Resources\JsonApiResource;

class ArticleResource extends JsonApiResource
{
    public $attributes = ['title', 'body', 'views'];

    public $relationships = ['author', 'comments'];
}

Совпадение типов ​

Ресурс сужает свои атрибуты по fields[<type>] с типом, который выводит из имени своего класса, а запрос сужает SELECT по ключам определения. Держите их одинаковыми: задайте определению type() ресурса и описывайте подгружаемую связь определением этого типа (Relationship::to('author', UserQuery::class)), чтобы до неё доходил fields[users], который присылает JSON:API-клиент.