Применение УНИКАЛЬНОГО ограничения между несколькими таблицами при использовании Doctrine

#php #mysql #doctrine-orm

#php #mysql #doctrine-orm

Вопрос:

Как я могу применить УНИКАЛЬНОЕ ограничение при использовании Doctrine для столбцов в двух разных таблицах? Например, 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="NSAppEntityEntityA" 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="NSAppEntityEntityB" 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>
  

Комментарии:

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

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

3. Доктрина, использующая xml, прекрасна 🙂

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

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