我的Symfony 4.3项目实体中有一个名为Group和MySql数据库中的表组。组是一个保留字。我有 3 个实体:用户、组、用户组。它们有关系:用户 ->OneToMany-> 用户组和组 -> OneToMany -> UserGroup(用户组具有其他属性,所以我不能使用 ManyToMany 关系(。当我尝试获取id=1的用户的组名时:
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)
->find($id);
$groups = $user->getUserGroups();
foreach ($groups as $group) {
$group_name = $group->getGroupId()->getName();
echo $group_name, '<br>';
}
我收到错误消息:
您有一个错误:使用参数 [1] 执行"SELECT t0.id AS id_1,t0.name AS name_2,其中 t0.id = ?"时发生异常: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误; 检查与您的MySQL服务器版本相对应的手册,了解在第1行的"组t0 WHERE t0.id = 1"附近使用的正确语法,代码: 0
文档 (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words( 中有一个方法,如何启用保留字的引用:
<?php
use DoctrineORMMappingAnsiQuoteStrategy;
$configuration->setQuoteStrategy(new AnsiQuoteStrategy());
我不明白我必须在哪里使用此代码 - 在实体管理器中,在控制器中?我怎样才能得到$configuration?
我认为更好的解决方案是在原则文档中提到的实体定义中使用刻度。
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="AppRepositoryGroupRepository")
* @ORMTable(name="`group`")
*/
class Group
{
// ...
}
请注意,仅当您使用默认报价策略时,此方法才有效。因此,请删除quote_strategy
参数或将其设置为doctrine.orm.quote_strategy.default
.
# config/packages/doctrine.yml
doctrine:
# ...
orm:
quote_strategy: doctrine.orm.quote_strategy.default