Учение и цитирование зарезервированного слова MySql - PullRequest
0 голосов
/ 10 октября 2019

У меня есть проект Symfony 4.3 с именем Group и table 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>';
    }

, я получаю сообщение об ошибке:

Возникла ошибка: возникла исключительная ситуация при выполнении SELECT t0.id ASid_1, t0.name AS name_2 ИЗ группы t0 ГДЕ t0.id =? 'с параметрами [1]: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'group t0 WHERE t0.id = 1' в строке 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? И как я могу получить конфигурацию $?

1 Ответ

0 голосов
/ 13 октября 2019

Я думаю, что лучшим решением будет использование галочек в определении вашей сущности, как указано в Документация доктрины .

<?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
...