Применение ограничения UNIQUE между несколькими таблицами при использовании Doctrine

Как при использовании Doctrine применить ограничение UNIQUE для столбцов в двух разных таблицах? Например, EntityB.some_property должен быть уникальным для данного EntityA.account_id? Если бы мне пришлось делать это без использования Doctrine, я бы просто продублировал account_id в entity_b и добавил ограничение. Однако с Doctrine это создаст объект Account в EntityB, что нежелательно.

entity_a
- id (PK)
- account_id (FK references account.id)

entity_b
- id (PK)
- primary_table_id (FK references entity_a.id)
- some_property (must be unique for a given account_id)

Как показано ниже, мой текущий подход просто создает сущность Account в EntityB, которую я бы предпочел не иметь.

<?xml version = "1.0" encoding = "utf-8"?>
<doctrine-mapping xmlns = "http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name = "NS\App\Entity\EntityA" table = "entity_a">
    <id name = "id" type = "integer">
      <generator strategy = "IDENTITY"/>
    </id>
    <many-to-one field = "account" target-entity = "Account" fetch = "LAZY">
      <join-columns>
        <join-column name = "account_id" referenced-column-name = "id" on-delete = "CASCADE" nullable = "false"/>
      </join-columns>
    </many-to-one>
  </entity>
</doctrine-mapping>

<?xml version = "1.0" encoding = "utf-8"?>
<doctrine-mapping xmlns = "http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name = "NS\App\Entity\EntityB" table = "entity_b">
    <unique-constraints>
      <unique-constraint name = "uniqueSomeProperty" columns = "some_property, account_id_constraint"/>
    </unique-constraints>
    <id name = "id" type = "integer">
      <generator strategy = "IDENTITY"/>
    </id>
    <field name = "someProperty" type = "integer" column = "some_property"/>
    <many-to-one field = "accountConstraint" target-entity = "Account" fetch = "LAZY">
      <join-columns>
        <join-column name = "account_id_constraint" referenced-column-name = "id" on-delete = "CASCADE" nullable = "false"/>
      </join-columns>
    </many-to-one>
  </entity>
</doctrine-mapping>

Можете ли вы показать, что вы сделали до сих пор?

programmer-man 28.03.2019 12:54

@programmer-man Я мог бы показать вам, как использовать XML, но, похоже, все используют аннотации. Я не очень хорошо разбираюсь в аннотациях, но попытаюсь перепроектировать то, что пробовал, если хотите.

user1032531 28.03.2019 12:57

Доктрина с использованием xml в порядке :)

programmer-man 28.03.2019 12:58

@programmer-man Спасибо. Начав использовать Doctrine месяц назад, я чувствовал, что XML будет лучше, но теперь я начинаю сомневаться в этом решении, так как я не могу найти столько документации, ориентированной на XML, а аннотации все еще остаются для меня загадочными.

user1032531 28.03.2019 13:05

«Однако с Doctrine это создаст объект Account в EntityB, что нежелательно». --- Что делать, если вы присвоили существующий идентификатор учетной записи EntityB?

programmer-man 28.03.2019 13:32

@programmer-man Если возможно, я думаю, это было бы здорово. Я ожидаю, что мне придется сделать $entityB->setAccountId(123); при создании нового EntityB, но это не большая проблема.

user1032531 28.03.2019 13:35

Вы уже сделали это? Это просто сеттер в вашем php-файле.

programmer-man 28.03.2019 13:37

Давайте продолжить обсуждение в чате.

user1032531 28.03.2019 13:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
172
0

Другие вопросы по теме