我在使用教义多对多、自引用教义文档时遇到问题
按照文档中的示例进行操作:
<entity
name="Application'Sonata'ProductBundle'Entity'Usersss"
table="usersss"
>
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
<many-to-many field="myFriends" target-entity="Application'Sonata'ProductBundle'Entity'Usersss" inversedBy="friendsWithMe">
<join-table name="friends">
<join-columns>
<join-column id="user_id" referenced-column-name="id" />
</join-columns>
<inverse-join-columns>
<join-column id="friend_user_id" referenced-column-name="id"/>
</inverse-join-columns>
</join-table>
</many-to-many>
<many-to-many field="friendsWithMe" target-entity="Application'Sonata'ProductBundle'Entity'Usersss" mappedBy="myFriends"/>
</entity>
Symfony2应该生成类似的东西(正如文档中所写的那样)
CREATE TABLE usersss (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE friends (
user_id INT NOT NULL,
friend_user_id INT NOT NULL,
PRIMARY KEY(user_id, friend_user_id)
) ENGINE = InnoDB;
ALTER TABLE friends ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE friends ADD FOREIGN KEY (friend_user_id) REFERENCES User(id);
但是 Symfony2 尝试生成这个:
CREATE TABLE usersss (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE friends (usersss_id INT NOT NULL, PRIMARY KEY(usersss_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE usersss_usersss (usersss_source INT NOT NULL, usersss_target INT NOT NULL, INDEX IDX_A8965F1863AC54F9 (usersss_source), INDEX IDX_A8965F187A490476 (usersss_target), PRIMARY KEY(usersss_source, usersss_target)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE friends ADD CONSTRAINT FK_21EE7069A764047 FOREIGN KEY (usersss_id) REFERENCES usersss (id);
ALTER TABLE usersss_usersss ADD CONSTRAINT FK_A8965F1863AC54F9 FOREIGN KEY (usersss_source) REFERENCES usersss (id) ON DELETE CASCADE;
ALTER TABLE usersss_usersss ADD CONSTRAINT FK_A8965F187A490476 FOREIGN KEY (usersss_target) REFERENCES usersss (id) ON DELETE CASCADE;
如果我将 inreverseedBy 更改为 inverted-by 并将 mappedby 更改为 mapped-by,mysql 看起来像
CREATE TABLE usersss (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE friends (usersss_id INT NOT NULL, PRIMARY KEY(usersss_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE friends ADD CONSTRAINT FK_21EE7069A764047 FOREIGN KEY (usersss_id) REFERENCES usersss (id);
这仍然不像文档示例中的样子
我不明白为什么我会有如此奇怪的行为......
编辑:实际上我发现了问题:由于您在XML中,因此需要使用"inreverseed-by"而不是"inversedBy"和"mapped-by"而不是"mappedBy"。
编辑 2:另外,将连接列中的"id"替换为"名称"。