CakePHP 3.0:Mysql 由 class 命名组引起的语法错误

CakePHP 3.0: Mysql Syntax Error caused by a class named Group

我刚刚创建了一个名为 group 的 table 并生成了引用此 table 的骨架文件。

我意识到这个名称输入与 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”的值更改为 true。可能需要清除缓存。

来源:https://book.cakephp.org/3.0/en/orm/database-basics.html#configuration

您确实可以启用 quoteItendifiers,但如上面的评论所述,这会带来性能损失。

我使用不同的解决方案来解决这个问题,通过为有问题的 db_table 自定义 Table class,如下所示:

请注意 table 别名 已重命名,还有 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

使用 CakePHP 3.6 $Group->find()->all() 运行成功。

我正在使用 CakePHP 4,为了解决这个问题,我刚刚在配置中添加了 quoteIdentifiers => true -> app_local -> datasources

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

引用标识符 如果您在 table 或列名称中使用保留字或特殊字符,请设置为 true。启用此设置将导致使用查询构建器构建的查询在创建 SQL 时引用标识符。需要注意的是,这会降低性能,因为每个查询在执行之前都需要遍历和操作。

查看更多内容:https://book.cakephp.org/4/en/orm/database-basics.html