Как добавить дополнительные внешние ограничения с помощью Doctrine? - PullRequest
0 голосов
/ 01 ноября 2019

Как добавить дополнительное внешнее ограничение, используя Doctrine? Например, допустим, у меня есть следующие три объекта:

<?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="Account" table="account">
    <id name="id" type="integer">
      <generator strategy="IDENTITY"/>
    </id>
  </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="Collection " table="collection ">
    <unique-constraints>
      <unique-constraint name="unique_pk " columns="id,account_id"/>
    </unique-constraints>
    <id name="id" type="integer">
      <generator strategy="IDENTITY"/>
    </id>
    <many-to-one field="account" target-entity="Account">
      <join-column name="account_id" referenced-column-name="id" on-delete="CASCADE" nullable="false"/>
    </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="Item " table="item ">
    <unique-constraints>
      <unique-constraint name="unique_something " columns="something_unique_to_collection, collection_id"/>
    </unique-constraints>
    <id name="id" type="integer">
      <generator strategy="IDENTITY"/>
    </id>
    <many-to-one field="collection" target-entity="Collection">
      <join-column name="collection_id" referenced-column-name="id" on-delete="SET NULL" nullable="true"/>
    </many-to-one>
    <many-to-one field="account" target-entity="Account">
      <join-column name="account_id" referenced-column-name="id" on-delete="CASCADE" nullable="false"/>
    </many-to-one>
  </entity>
</doctrine-mapping>

Теперь я хочу убедиться, что Item.something_unique_to_collection уникален для данного Collection, а также хочу убедиться, что Item иCollection принадлежат тому же Account. Требуемый SQL такой, как показано, и часть, в которой мне нужна помощь, - это как добавить последний элемент CONSTRAINT fk_shared FOREIGN KEY (collection_id, account_id) REFERENCES collection (id, account_id)) в Item. Как видно, id и account_id уже существуют в таблице из других ассоциаций, поэтому я не могу сделать это обычным способом.

CREATE TABLE IF NOT EXISTS account (
  id INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS collection (
  id INT(11) NOT NULL AUTO_INCREMENT,
  account_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY unique_pk (id, account_id),
  CONSTRAINT fk_collection_account FOREIGN KEY (account_id) REFERENCES account (id) ON DELETE CASCADE ON UPDATE NO ACTION)
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS item (
  id INT(11) NOT NULL,
  collection_id INT(11) NULL,
  account_id INT(11) NOT NULL,
  something_unique_to_collection INT(11) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY unique_something (something_unique_to_collection, collection_id),
  CONSTRAINT fk_item_account FOREIGN KEY (account_id) REFERENCES account (id) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT fk_item_collection FOREIGN KEY (collection_id) REFERENCES collection (id) ON DELETE SET NULL ON UPDATE NO ACTION,
  CONSTRAINT fk_shared FOREIGN KEY (collection_id, account_id) REFERENCES collection (id, account_id))
ENGINE = InnoDB;
...