3

我建立了一个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 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()。但这当然不是……嗯……一个很好的解决方案。

4

1 回答 1

0

我也有类似的情况。不过,似乎原始错误已得到修复。

跑步:

./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 注释以使用复数“组”。

在模块\实体\组中

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

在模块\实体\用户

/**
 * @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,并且实体名称可以保持不变。

于 2014-08-26T17:00:57.653 回答