Сайт ↗
Разделы документации
CLI интерфейс · 0.8.1

CLI: ссылки и коллекции

Как создать belongsTo, hasMany и manyToMany и выбрать отображение связанных записей.

На этой странице

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.