Skip to content

Поля ​

fields() перечисляет колонки, которые запрос клиента может выбрать через fields[<key>]:

php
public function fields(): array
{
    return ['id', 'name', 'email', 'profile.bio', Field::virtual('display_name', dependsOn: ['name', 'nickname'])];
}
GET /users?fields[users]=id,name

Без fields[...] выбираются все колонки.

Ключи ​

fields[<key>] принимает список через запятую. Ключ — это одно из:

  • тип ресурса корня (fields[users]) или отсутствие ключа (fields=name);
  • путь подгрузки связи (fields[posts], fields[posts.comments]);
  • тип вложенного определения (fields[posts] действует на все пути, к которым подключён PostQuery).

Ключ, который одновременно путь подгрузки и тип (связь posts, описанная PostQuery с типом posts), проверяется по этому пути и, кроме того, сужает другие подгруженные пути этого типа, для которых запрос не задаёт своего ключа: fields[posts]=title сужает и latestPost, если не передан также fields[latestPost]=....

Поле через точку в fields() (profile.bio) разрешает поле связи, у которой нет своего определения.

Обращение к одному пути по двум разным ключам (например, fields=... вместе с fields[users]=...) отклоняется с ambiguous_fields.

В циклическом определении тип корня действует и на вложенные пути того же типа (fields[users] сужает posts.author); вложенный путь со своим ключом (fields[posts.author]=id) берёт свой ключ.

Имена под ключом — его собственные поля: fields[users]=users.name — это name, а имя, квалифицированное другим ресурсом (fields[users]=posts.title), — ошибка unknown_field, а не title корня. Поля связи указываются под её собственным ключом (fields[posts]=title).

Ключи выбираются всегда ​

Первичный ключ корня и каждой связи с набором полей выбирается всегда, как и ключи, нужные каждой подгруженной связи. Это обычные атрибуты загруженных моделей, поэтому скрывайте их в своих API-ресурсах, если их нельзя отдавать.

Виртуальные поля ​

Field::virtual('display_name', dependsOn: ['name', 'nickname']) — поле, которое не является колонкой. Запрос этого поля выбирает его зависимости, а если у модели есть для него аксессор (displayName(), возвращающий Attribute, или getDisplayNameAttribute()), поле добавляется к загруженным моделям через append, так что toArray() и обычный JsonResource его возвращают.

Само виртуальное имя в SELECT не попадает. Без аксессора вычисляйте значение в своём ресурсе из зависимостей.