entity relation связывает уже описанные сущности. До добавления связи проверьте их первичные ключи и совместимость типов. Ссылка статьи на раздел и список тегов используют разные способы хранения и поэтому разные параметры.
Ссылка статьи на один раздел
Создайте Article и Section с идентификаторами. Для ссылки нужно поле типа relation с метаданными связи: обычного int с таким же типом, как у ключа цели, недостаточно.
Если sectionId ещё нет, добавьте его:
admingen-cli --path ./docs-demo field add Article sectionId --type relation \
--relation-target Section --relation-type belongsTo \
--relation-foreign-key sectionId --required
Затем опишите связь со стороны владельца:
admingen-cli --path ./docs-demo entity relation add Article section \
--type belongsTo --target Section --foreign-key sectionId \
--target-field id --enforce=true --on-delete restrict \
--on-update restrict --display-field title
--foreign-key — поле Article, --target-field — первичный ключ Section. --display-field задаёт понятную подпись в выборе и не меняет физическую связь.
Политику setNull используйте для согласованной необязательной ссылки. Настройки обязательности и null у поля должны позволять такое действие.
Коллекция тегов
admingen-cli --path ./docs-demo entity relation add Article tags \
--type manyToMany --target Tag --through article_tags \
--source-field id --target-field id \
--inverse-name articles --display-field title
--through именует промежуточную таблицу. --source-field и --target-field — первичные ключи сущностей, а не колонки промежуточной таблицы. Обратное имя относится к той же связи. Не создавайте вторую встречную manyToMany для её дублирования.
Для hasMany укажите --owner-relation: существующую belongsTo целевой сущности. Так создаётся обратное представление без нового внешнего ключа. Подробнее о владении — модель отношений.
Изменение существующей связи
admingen-cli --path ./docs-demo entity relation update Article section --display-field title
Отображаемые параметры и физическое хранение — разные настройки. Изменение выпущенной физической связи может быть запрещено. При generated_relation_change_blocked посмотрите, какое свойство вызвало ошибку и что предлагает сообщение. Принудительное применение не разрешает обход проверки схемы.
После сохранения проверьте plan/dry-run, выполните Generate и примените нужные миграции. Проверка ограничений NOT VALID выполняется командами готового приложения, а не командой relation генератора.
Справочник команд
| Команда | Вызов |
|---|---|
entity relation |
admingen-cli entity relation [command] |
entity relation add |
admingen-cli entity relation add <entity-name> <relation-name> [flags] |
entity relation delete |
admingen-cli entity relation delete <entity-name> <relation-name> [flags] |
entity relation update |
admingen-cli entity relation update <entity-name> <relation-name> [flags] |
Общие --path, --output, --help — в основах CLI. Подставляйте свои имена вместо аргументов в угловых скобках. В update непереданные свойства сохраняются.
Параметры связи
| Параметр | Где применяется | По умолчанию | Смысл |
|---|---|---|---|
--display-field VALUE |
entity relation add, entity relation update |
пустая строка | Поле цели для читаемой подписи связанной записи. |
--enforce |
entity relation add, entity relation update |
true | Для belongsTo — создавать ограничение внешнего ключа PostgreSQL. |
--foreign-key VALUE |
entity relation add, entity relation update |
пустая строка | Поле исходной сущности, хранящее ссылку. |
--inverse-name VALUE |
entity relation add, entity relation update |
пустая строка | Имя производного обратного представления many-to-many; второго владельца не создаёт. |
--on-delete VALUE |
entity relation add, entity relation update |
пустая строка | Политика связи belongsTo с ограничением внешнего ключа при удалении цели: restrict или setNull. |
--on-update VALUE |
entity relation add, entity relation update |
пустая строка | Политика связи belongsTo с ограничением внешнего ключа при изменении ключа цели: restrict или cascade. |
--owner-relation VALUE |
entity relation add, entity relation update |
пустая строка | Имя владеющей связи belongsTo на целевой сущности для hasMany. |
--source-field VALUE |
entity relation add, entity relation update |
пустая строка | PK исходной сущности, не колонка промежуточной таблицы. |
--target VALUE |
entity relation add, entity relation update |
пустая строка | Целевая сущность отношения. |
--target-field VALUE |
entity relation add, entity relation update |
пустая строка | PK целевой сущности. |
--through VALUE |
entity relation add, entity relation update |
пустая строка | Имя промежуточной таблицы many-to-many. |
--type VALUE |
entity relation add, entity relation update |
пустая строка | Для поля — поддерживаемый тип данных; для relation — belongsTo, hasMany или manyToMany. |
--new-name VALUE |
entity relation update |
пустая строка | Новое имя там, где это поддерживает команда. Для сохранённого поля обычный update не переименовывает его: используйте Rename. |