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;
不是纯粹主义者,而是意味着不黑客学说,实体名称可以保持不变。