在方案更新时,Doctrine2不会转义表名

时间:2012-12-29 10:20:34

标签: mysql doctrine-orm

我构建了一个doctrine2实体类Group并引用了表名:

/**
 * models\Entity\Group
 *
 * @ORM\Entity(repositoryClass="models\Repository\GroupRepository")
 * @ORM\Table(name="`group`", indexes={@ORM\Index(name="admin", columns={"`admin`"})})
 */
class Group
{

但是,doctrine似乎不会在每个查询中引用表名。当我运行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 */

\Doctrine\DBAL\Platforms\AbstractPlatform::getCreateForeignKeySQL()getDropForeignKeySQL()。但当然这不是......呃...一个非常好的解决方案。

1 个答案:

答案 0 :(得分:0)

我处于类似情况。看起来原来的bug似乎已经修好了。

运行:

./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);

上表名称已正确转义。

<强>然而

稍后尝试从该表中 SELECT 时,我收到错误。

function getGroupByName($name)
{
    $em = $this->getEntityManager();
    $criteria = array('name' => $name);
    return $em->getRepository('Module\Entity\Group')
        ->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注释即可使用复数“组”。

在Module \ Entity \ Group

/**
 * @ORM\Table(name="groups")
 */

在Module \ Entity \ User

/**
 * @ORM\ManyToMany(targetEntity="Module\Entity\Group", inversedBy="users")
 * @ORM\JoinTable(
 *     name="groups_user",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)},
 *     inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)}
 * )
 */
private $groups;

这不是纯粹主义者,但它意味着不破坏Doctrine,实体名称可以保持不变。