我在MySql数据库的Symfony 4.3项目实体中有名为Group和table group的实体。组是保留字。我有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>';
}
我收到错误消息:
您有一个错误:执行'SELECT t0.id AS id_1,t0.name AS name_2 FROM group t0 WHERE t0.id =?带有参数[1]:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在行1的'group 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 Doctrine\ORM\Mapping\AnsiQuoteStrategy;
$configuration->setQuoteStrategy(new AnsiQuoteStrategy());
我不知道我必须在哪里使用此代码-在EntityManager中,在Controller中?以及如何获得$ configuration?
我认为更好的解决方案是在Doctrine Documentation中提到的实体定义中使用刻度。
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\GroupRepository")
* @ORM\Table(name="`group`")
*/
class Group
{
// ...
}
注意,仅当您使用默认报价策略时,此方法才有效。因此,删除quote_strategy
参数或将其设置为doctrine.orm.quote_strategy.default
。
# config/packages/doctrine.yml
doctrine:
# ...
orm:
quote_strategy: doctrine.orm.quote_strategy.default