我刚刚创建了一个名为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
有没有办法避免这种错误?
3条答案
按热度按时间nwwlzxa71#
我刚找到解决办法。解决方案是在数据源配置中将“quoteidentifiers”的值更改为true。你可能需要清除缓存。
资料来源:https://book.cakephp.org/3.0/en/orm/database-basics.html#configuration
ogsagwnx2#
实际上,您可以启用
quoteItendifiers
但正如上面的评论所说,这带来了性能上的冲击。我使用不同的解决方案来解决这个问题,通过定制
Table class
对于有问题的db_table
像这样:请注意正在重命名的表别名以及我手动转义的表名
这将生成如下所示的查询:
使用cakephp 3.6
$Group->find()->all()
运行成功。frebpwbc3#
我使用的是cakephp4,为了解决这个问题,我在config->app\u local->datasources中添加了quoteidentifiers=>true
如果在表或列名中使用保留字或特殊字符,请将quoteidentifiers设置为true。启用此设置将导致使用查询生成器生成的查询在创建sql时引用标识符。应该注意,这会降低性能,因为每个查询在执行之前都需要遍历和操作。
详见:https://book.cakephp.org/4/en/orm/database-basics.html