CakePHP 3.0:名为Group的类导致的Mysql语法错误
我刚刚创建了一个名为group的表,并生成了引用此表的骨架文件 我意识到这个名称输入与MySQL保留字冲突,因为cakephp3.0生成如下查询: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
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缓存以获得更好的体验。更多信息,请参阅: