我构建了一个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()
。但当然这不是......呃...一个非常好的解决方案。
答案 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,实体名称可以保持不变。