CakePHP 3.0: синтаксическая ошибка Mysql, вызванная классом с именем Group

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

Я понял, что это имя вступает в конфликт с зарезервированными словами MySQL, потому что cakephp3.0 генерирует такие запросы:

SELECT 
     Group.group_id AS `Group__group_id`, 
     Group.name AS `Group__name`, 
     Group.created_at AS `Group__created_at` 
FROM 
     group Group 
LIMIT 
     20 OFFSET 0

Это вызывает эту ошибку:

 Error: 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 Group 
LIMIT 20 OFFSET 0' at line 1

Есть ли способ избежать такой ошибки?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
274
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я только что нашел решение. Решение состоит в том, чтобы изменить значение «quoteIdentifiers» на правда в вашей конфигурации источника данных. Может вам понадобится очистить кеш.

Источник: https://book.cakephp.org/3.0/en/orm/database-basics.html#configuration

Я предлагаю следовать соглашения об именах CakePHP и использовать имя во множественном числе, то есть называть таблицу groups.

ndm 15.05.2018 09:08
Ответ принят как подходящий

Действительно, вы можете включить quoteItendifiers, но это приведет к снижению производительности, как сказано в комментарии над ним.

Я использую другое решение этой проблемы, настраивая Table class для проблемного db_table следующим образом:

Обратите внимание, что псевдоним таблицы переименовывается, а также имя таблицы, который я экранировал вручную.

class GroupTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config); // TODO: Change the autogenerated stub
        $this->setAlias('MyGroup');
        $this->setTable("`group`");
    }

}

Это сгенерирует запрос следующего вида:

SELECT 
  MyGroup.id AS `MyGroup__id`, 
  MyGroup.filed1 AS `MyGroup__filed1` 
FROM 
   `group` MyGroup

$Group->find()->all() успешно работает с CakePHP 3.6.

Думаю, это лучшее решение! Меньше воздействия и понятий.

Eduan Lenine 15.05.2018 17:40

Я использую CakePHP 4, и для решения этой проблемы я просто добавил quoteIdentifiers => true внутри config -> app_local -> datasources

Datasources' => [
    'default' => [
        'quoteIdentifiers' => true,
        'host' => '127.0.0.1',

quoteIdentifiers Установите значение true, если вы используете зарезервированные слова или специальные символы в именах таблиц или столбцов. Включение этого параметра приведет к тому, что запросы, построенные с использованием построителя запросов, будут содержать идентификаторы, цитируемые при создании SQL. Следует отметить, что это снижает производительность, потому что каждый запрос необходимо просмотреть и обработать перед выполнением.

См. Больше в: https://book.cakephp.org/4/en/orm/database-basics.html

знаете ли вы, есть ли такая же функция в CakePHP 3?

lucasreta 20.10.2020 02:47

@lucasreta, Да, в CakePHP 3 есть эта функция, очистите кеш cakephp для лучшего опыта. См. Больше в: book.cakephp.org/3/en/orm/database-basics.html#configuration

Rafael 20.10.2020 13:40

Другие вопросы по теме