Данный раздел входит в состав раздела элементы формы и описывает работу с отношениями моделей через создание inline-форм редактирования/создания связанных моделей.
Когда необходимо использовать вложенные формы? Почти всегда! В вашем проекте с 90% вероятностью будут модели, которые
имеют отношения с другими моделями. Напрмер, у пользователя может быть несколько профилей (has-many
), у магазина
может быть несколько адресов (has-many
), у товара может быть много характеристик, а в связывающей таблице изменяется
только значение этих характеристик (many-to-many
).
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;
AdminFormElement::manyToMany(string $relation, array $elements): static
$relation
- Имя отношения модели$elements
- Поля отношения
Описывает вложенную форму для отношения ManyToMany
.
Иногда вам требуется изменять pivot
атрибуты в связанных таблицах, но, чтобы сделать это, чаще всего вы прибегаете
к следующему решению:
- Создать связующую таблицу и добавить туда автоинкрементное поле для идентификации;
- Создать модель для этой связующей таблицы;
- Создать раздел, для управления этими связями;
- Добавить в форму создания/редактирования как минимум 2 поля типа
select
, ссылающиеся на связанные сущности; - Добавить в форму создания/редактирования элементы для управления
pivot
полями таблицы.
С помощью формы ManyToMany
вы можете забыть о создании таких разделов!
Элемент manyToMany
автоматически добавляет форме элемент типа select
с выбором связанной модели, вам необходимо
только заполнить дополнительные поля.
Пример: имеется модель Product
и ProductProperties
со связью many-to-many
и доп. свойством value
в связующей
таблице. Необходимо реализовать inline
добавление/удаление значений свойств товаров.
AdminFormElement::manyToMany('properties', [
// Pivot поле value для связующей таблицы
AdminFormElement::text('value')->required(),
]);
Устанавливает поля промежуточной таблицы, которые должны быть провалидированны как уникальные. По умолчанию массив
состоит из foreign_key
целевой модели и foreign_key
модели отношения. Если метод вызван, необходимо явно передать
foreign_key
модели отношения с дополнительными полями.
foreign_key
целевой модели будет всегда добавлен в массив уникальных полей.
Возвращает элемент, управляющий значением связанной модели. Может быть использован для управления внешним видом элемента формы.
AdminFormElement::belongsTo(string $relation, array $elements): static
$relation
- Имя отношения модели$elements
- Поля отношения
Описывает вложенную форму для отношения BelongsTo
. Работает аналогично HasMany
, позволяя управлять только 1
связанной моделью.
$callable
- функция, которая будет вызвана с обектом отношения для изменения запроса.
Позволяет изменять поведение загрузки отношений. Полезно, когда необходимо изменять порядок вывода списка отношений в форме.
ВНИМАНИЕ! Добавление фильтрации в модификатор запроса приведет к тому, что в списке будет отображен не полный список связанных сущностей. Используйте с осторожностью.
Устанавливает заголовок формы связанных отношений.
Устанавливает заголовок для каждой "группы" форм. Группа - блок единицы создаваемого/редактируемого отношения с собственными полями.
Устанавливает лимит на количество возможных добавляемых отношений.
Отключает возможность добавления новых отношений в форме.
Включает копирование созданных отношения при действии формы Сохранить с создать
. Все значения будут скопированы для следующего
запроса. По умолчанию функционал отключен в связи с тем, что может возникнуть серверная ошибка максимального объема
строки запроса.