X2CRM自定义模块查看记录时触发SQL分组查询错误
X2CRM自定义模块详情页SQL语法错误问题
我在X2CRM中创建了一个自定义模块,随后在该模块中创建了一条新记录,并使用Log Time小部件记录时间。但从「全部记录」视图点击该记录名称查看详情时,出现以下错误:
CDbCommand执行SQL语句失败:SQLSTATE[42000]: 语法错误或访问违规: 1055 SELECT列表的第7个表达式不在GROUP BY子句中,且包含非聚合列'x2_db.x2_actions.complete',该列不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容
我在谷歌上见过其他框架的类似问题,但此模块是通过后台管理区域的内置代码生成器创建的,那些解决方案不适用于此CRM。查看日志也未发现相关内容。
更新:
我在堆栈跟踪中发现,触发该SQL的调用来自源代码中的以下行:
ActionHistoryChartWidget::getChartData('1675792337', 1675967470, '8', 'tasks', NULL)
解决方法
方案1:修复ActionHistoryChartWidget的SQL查询逻辑
- 找到X2CRM源码中的
protected/widgets/ActionHistoryChartWidget.php文件 - 定位到
getChartData方法内生成SQL查询的代码段 - 检查SELECT语句中包含的
x2_actions.complete字段,将其添加到GROUP BY子句中;如果该字段不需要展示在查询结果里,直接从SELECT列表中移除 - 保存修改后,刷新页面测试详情页访问
方案2:临时调整MySQL的sql_mode(不推荐长期使用)
如果暂时无法修改代码,可以临时关闭MySQL的only_full_group_by模式:
- 登录MySQL命令行控制台,执行:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
- 如需永久生效,修改MySQL配置文件(Linux为
my.cnf,Windows为my.ini),找到sql_mode配置项,移除其中的ONLY_FULL_GROUP_BY,保存后重启MySQL服务
内容的提问来源于stack exchange,提问作者Farhan Gul
相关产品推荐
相关产品推荐

