Skip to content

Latest commit

 

History

History
157 lines (108 loc) · 7.88 KB

related-forms.md

File metadata and controls

157 lines (108 loc) · 7.88 KB

Вложенные формы отношений

Данный раздел входит в состав раздела элементы формы и описывает работу с отношениями моделей через создание inline-форм редактирования/создания связанных моделей.

Когда необходимо использовать вложенные формы? Почти всегда! В вашем проекте с 90% вероятностью будут модели, которые имеют отношения с другими моделями. Напрмер, у пользователя может быть несколько профилей (has-many), у магазина может быть несколько адресов (has-many), у товара может быть много характеристик, а в связывающей таблице изменяется только значение этих характеристик (many-to-many).

HasMany

AdminFormElement::hasMany(string $relation, array $elements): static
  • $relation - Имя отношения модели
  • $elements - Поля отношения

Описывает вложенную форму для отношения HasMany.

Пример: имеются модели User и Profile, связанные отношением one-to-many. Необходимо редактировать профили пользователя на странице редактирования пользователя.

// onEdit
$form = AdminForm::panel();

$profiles = AdminFormElement::hasMany('profiles', [
    AdminFormElement::text('name', 'Имя')->required(),
    AdminFormElement::text('last_name', 'Фамилия'),
    AdminFormElement::text('phone', 'Телефон')->required(),
]);

$tabs = AdminDisplay::tabbed([
    AdminDisplay::tab($profiles, 'Профили'),
]);

$form->addBody($tabs);

return $form;

ManyToMany

AdminFormElement::manyToMany(string $relation, array $elements): static
  • $relation - Имя отношения модели
  • $elements - Поля отношения

Описывает вложенную форму для отношения ManyToMany.

Иногда вам требуется изменять pivot атрибуты в связанных таблицах, но, чтобы сделать это, чаще всего вы прибегаете к следующему решению:

  1. Создать связующую таблицу и добавить туда автоинкрементное поле для идентификации;
  2. Создать модель для этой связующей таблицы;
  3. Создать раздел, для управления этими связями;
  4. Добавить в форму создания/редактирования как минимум 2 поля типа select, ссылающиеся на связанные сущности;
  5. Добавить в форму создания/редактирования элементы для управления pivot полями таблицы.

С помощью формы ManyToMany вы можете забыть о создании таких разделов!

Элемент manyToMany автоматически добавляет форме элемент типа select с выбором связанной модели, вам необходимо только заполнить дополнительные поля.

Пример: имеется модель Product и ProductProperties со связью many-to-many и доп. свойством value в связующей таблице. Необходимо реализовать inline добавление/удаление значений свойств товаров.

AdminFormElement::manyToMany('properties', [
    // Pivot поле value для связующей таблицы
    AdminFormElement::text('value')->required(),
]);

Доступные методы

unique(array $fields): static

Устанавливает поля промежуточной таблицы, которые должны быть провалидированны как уникальные. По умолчанию массив состоит из foreign_key целевой модели и foreign_key модели отношения. Если метод вызван, необходимо явно передать foreign_key модели отношения с дополнительными полями.

foreign_key целевой модели будет всегда добавлен в массив уникальных полей.

getRelatedElement(): SleepingOwl\Admin\Form\Element\Select

Возвращает элемент, управляющий значением связанной модели. Может быть использован для управления внешним видом элемента формы.

BelongsTo

AdminFormElement::belongsTo(string $relation, array $elements): static
  • $relation - Имя отношения модели
  • $elements - Поля отношения

Описывает вложенную форму для отношения BelongsTo. Работает аналогично HasMany, позволяя управлять только 1 связанной моделью.


API

modifyQuery(callable $callback): static

  • $callable - функция, которая будет вызвана с обектом отношения для изменения запроса.

Позволяет изменять поведение загрузки отношений. Полезно, когда необходимо изменять порядок вывода списка отношений в форме.

ВНИМАНИЕ! Добавление фильтрации в модификатор запроса приведет к тому, что в списке будет отображен не полный список связанных сущностей. Используйте с осторожностью.

setLabel(string $label): static

Устанавливает заголовок формы связанных отношений.

setGroupLabel(string $label): static

Устанавливает заголовок для каждой "группы" форм. Группа - блок единицы создаваемого/редактируемого отношения с собственными полями.

setLimit(int $limit): static

Устанавливает лимит на количество возможных добавляемых отношений.

disableCreation(): static

Отключает возможность добавления новых отношений в форме.

copyAfterSave(): static

Включает копирование созданных отношения при действии формы Сохранить с создать. Все значения будут скопированы для следующего запроса. По умолчанию функционал отключен в связи с тем, что может возникнуть серверная ошибка максимального объема строки запроса.