CakePHP 3.0:名为Group的类导致的Mysql语法错误

CakePHP 3.0:名为Group的类导致的Mysql语法错误,mysql,cakephp-3.0,Mysql,Cakephp 3.0,我刚刚创建了一个名为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 OFFSE

我刚刚创建了一个名为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

有没有办法避免这种错误?

我刚刚找到了解决办法。解决方案是在数据源配置中将“quoteIdentifiers”的值更改为true。您可能需要清除缓存


来源:

确实,您可以启用
quoteItendifiers
,但正如上面的评论所说,这会带来性能的提升

对于这个问题,我使用了不同的解决方案,通过为有问题的
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 挑选 MyGroup.id为'MyGroup\uu id`, MyGroup.filed1作为“MyGroup\uu filed1” 从…起 `组`我的组
使用CakePHP 3.6,
$Group->find()->all()
成功运行

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

Datasources' => [
    'default' => [
        'quoteIdentifiers' => true,
        'host' => '127.0.0.1',
quoteIdentifiers 如果在表名或列名中使用保留字或特殊字符,请设置为true。启用此设置将导致使用查询生成器生成的查询在创建SQL时引用标识符。应该注意,这会降低性能,因为每个查询在执行之前都需要遍历和操作


更多信息请参见:

我建议遵循并使用复数名称,即将表格命名为
groups
。我想这是最好的解决方案!减少影响和影响。你知道CakePHP 3中是否存在相同的功能吗?@lucasreta,是的,CakePHP 3有此功能,请清除CakePHP缓存以获得更好的体验。更多信息,请参阅: