Doctrine Many-to-Many,自我引用的怪异行为(Symfony2)


Doctrine Many-To-Many, Self-referencing weird behavior (Symfony2)

我在使用教义多对多、自引用教义文档时遇到问题

按照文档中的示例进行操作:

<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"替换为"名称"。