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