cakephp3.0:名为group的类导致的mysql语法错误

3zwtqj6y  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(234)

我刚刚创建了一个名为group的表,并生成了引用该表的 backbone 文件。
我意识到这个名字与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

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

nwwlzxa7

nwwlzxa71#

我刚找到解决办法。解决方案是在数据源配置中将“quoteidentifiers”的值更改为true。你可能需要清除缓存。
资料来源:https://book.cakephp.org/3.0/en/orm/database-basics.html#configuration

ogsagwnx

ogsagwnx2#

实际上,您可以启用 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

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

frebpwbc

frebpwbc3#

我使用的是cakephp4,为了解决这个问题,我在config->app\u local->datasources中添加了quoteidentifiers=>true

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

如果在表或列名中使用保留字或特殊字符,请将quoteidentifiers设置为true。启用此设置将导致使用查询生成器生成的查询在创建sql时引用标识符。应该注意,这会降低性能,因为每个查询在执行之前都需要遍历和操作。
详见:https://book.cakephp.org/4/en/orm/database-basics.html

相关问题