Я только что создал таблицу с именем группа и сгенерировал файлы скелетов, на которые ссылается эта таблица.
Я понял, что это имя вступает в конфликт с зарезервированными словами 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
Есть ли способ избежать такой ошибки?






Я только что нашел решение. Решение состоит в том, чтобы изменить значение «quoteIdentifiers» на правда в вашей конфигурации источника данных. Может вам понадобится очистить кеш.
Источник: https://book.cakephp.org/3.0/en/orm/database-basics.html#configuration
Действительно, вы можете включить 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.
Думаю, это лучшее решение! Меньше воздействия и понятий.
Я использую 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, Да, в CakePHP 3 есть эта функция, очистите кеш cakephp для лучшего опыта. См. Больше в: book.cakephp.org/3/en/orm/database-basics.html#configuration
Я предлагаю следовать соглашения об именах CakePHP и использовать имя во множественном числе, то есть называть таблицу
groups.