Doctrine2在方案更新上未逃脱表名



i构建一个doctrine2 entity类Group并引用表名称:

/**
 * modelsEntityGroup
 *
 * @ORMEntity(repositoryClass="modelsRepositoryGroupRepository")
 * @ORMTable(name="`group`", indexes={@ORMIndex(name="admin", columns={"`admin`"})})
 */
class Group
{

但学说似乎并未在每个查询上引用表名。当我运行doctrine orm:schema-tool:update --dump-sql时,最后两个查询未逃脱:

ALTER TABLE group DROP FOREIGN KEY FK_6DC044C5814666E9;
ALTER TABLE group ADD CONSTRAINT FK_6DC044C5814666E9 FOREIGN KEY (`admin`) REFERENCES `user` (`id`)

这里做错了什么?

编辑

现在我替换了

    if ($table instanceof Table) {
        $table = $table->getQuotedName($this);
    }

通过这个

    if ($table instanceof Table) {
        $table = $table->getQuotedName($this);
    } /* Start hack */ else if (0 !== strpos($table, '`'))
        $table = "`$table`"; /* End hack */

DoctrineDBALPlatformsAbstractPlatform::getCreateForeignKeySQL()getDropForeignKeySQL()中。但是,当然不是……一个很好的解决方案。

我处于类似情况。好像原始错误已修复。

运行:

./vendor/bin/doctrine-module orm:schema:create --dump-sql

给出此SQL,这是正确的。

ALTER TABLE groups_user ADD CONSTRAINT FK_F0F44878A76ED395 FOREIGN KEY (user_id) REFERENCES User (id);
ALTER TABLE groups_user ADD CONSTRAINT FK_F0F44878FE54D947 FOREIGN KEY (group_id) REFERENCES `group` (id);

上面的表名是正确逃脱的。

但是

尝试从该表中选择 以后会遇到错误。

function getGroupByName($name)
{
    $em = $this->getEntityManager();
    $criteria = array('name' => $name);
    return $em->getRepository('ModuleEntityGroup')
        ->findOneBy($criteria);
}

投掷:

An exception occurred while executing 'SELECT t0.id AS id1, t0.name AS name2 FROM group t0 WHERE t0.name = ? LIMIT 1' with params ["The Group Name"]:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group t0 WHERE t0.name = 'The Group Name' LIMIT 1' at line 1

如上所述,在FROM group t0 WHERE中应逃脱表名,但不是。

我的愚蠢解决方案是使所有实体名称保持不变,并简单地更新ORM注释以使用复数"组"。

在模块 Entity group

/**
 * @ORMTable(name="groups")
 */

在模块 Entity user

/**
 * @ORMManyToMany(targetEntity="ModuleEntityGroup", inversedBy="users")
 * @ORMJoinTable(
 *     name="groups_user",
 *     joinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id", nullable=false)},
 *     inverseJoinColumns={@ORMJoinColumn(name="group_id", referencedColumnName="id", nullable=false)}
 * )
 */
private $groups;

不是纯粹主义者,而是意味着不黑客学说,实体名称可以保持不变。

相关内容

  • 没有找到相关文章