Как добавить дополнительное внешнее ограничение, используя 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;