Я работаю над проектом Symfony 7.3, работающим на PHP 8.2. Недавно я перенес базу данных с MySQL на PostgreSQL, и с тех пор я столкнулся с очень специфичной проблемой с ORM Doctrine, которая проявляется только в контексте HTTP.
Проблема
Когда я пытаюсь получить данные из таблицы user через HTTP-запрос, я получаю следующую ошибку SQL:
Код: Выделить всё
SQLSTATE[42703]: Undefined column: 7
ERROR: column t0.id does not exist
LINE 1: SELECT t0.id AS id_1, t0.email AS email_2, t0.password AS pa...
Фактические наблюдения (важно)
1. Интерфейс командной строки (CLI) работает нормально
При выполнении запросов непосредственно через консоль Symfony (которая использует ту же самую конфигурацию Doctrine и подключение к базе данных) все работает отлично. Это подтверждает существование таблицы public.user и идентификатора столбца.
2. Сбой изолированного контроллера отладки 
Минимальный контроллер отладки, извлекающий объект User, вызывает ошибку.
3. Рабочий контрпример (Подсказка) 
Конструктивно идентичный контроллер для Код: Выделить всё
CustomerОбъект Код: Выделить всё
userСведения об объекте и базе данных
Пользовательский объект (сокращенно)
Объект использует стандартные аннотации Doctrine:Код: Выделить всё
// src/Entity/User.php
#[ORM\Entity(repositoryClass: 'App\Repository\UserRepository')]
#[ORM\Table(name: 'user')] // Problematic line
class User {
// ... ORM\Id and ORM\Column definitions
}
Структура базы данных
- СУБД: PostgreSQL
- Имя таблицы в БД: user (строчные буквы, общедоступная схема)
- Факт PostgreSQL: Слово user является зарезервированным ключевым словом SQL.
Я обнаружил, что ошибка устраняется вручную заставляя Doctrine цитировать имя таблицы с помощью обратных кавычек в сопоставлении сущностей:
Код: Выделить всё
// Temporary Fix
#[ORM\Table(name: '`user`')]
Вопрос
Основываясь на подтвержденной основной причине (пользователь зарезервированного ключевого слова PostgreSQL не надежно цитируется в контексте HTTP) и стремлении к чистому, глобальному решению:
Какой базовый параметр конфигурации Doctrine DBAL или Symfony (например, в Doctrine.yaml), который должен быть применен к соединению PostgreSQL, чтобы глобально обеспечить соблюдение правильное поведение кавычек для всех зарезервированных ключевых слов SQL, что позволяет сопоставлению сущностей оставаться чистым (
Код: Выделить всё
#[ORM\Table(name: 'user')]Подробнее здесь: https://stackoverflow.com/questions/798 ... only-in-ht
Мобильная версия