我有以下查询构建器:
$queryBuilder = $this
->createQueryBuilder('recipient')
->leftJoin('recipient.message', 'message')
->orderBy('message.dateSent', 'DESC');
这一直运行良好:) - 但自升级到Mysql 5.7
后,我开始在任何地方都遇到此错误:
SQLSTATE [HY000]:
不兼容
一般错误:3065
ORDER BY
子句的表达式#1不在SELECT
列表中,参考列'dctrn_result.date_sent_5'
不在SELECT
列表中;
这与DISTINCT
我已经在大多数使用DBAL
图层的地方解决了这个问题,只需将项目添加到选择列表中,但我无法弄清楚如何使用此特定{{1 }}
答案 0 :(得分:22)
您必须通过添加以下行来编辑/etc/mysql/mysql.cnf
:
[mysqld]
sql-mode=""
别忘了重启服务mysql:
sudo service mysql restart
有关信息,我使用的是Ubuntu 16.04 LTS。
答案 1 :(得分:14)
添加:
[mysqld]
sql-mode=""
到/etc/mysql/my.cnf
为我解决了问题(重启服务后)。虽然官方对doctrine issue的回应当然会更好。
更新:有人对此了解recommended only disabling the mode that's causing the problem.
答案 2 :(得分:2)
在#4846中报告了一个错误,它似乎与#sqlmode_only_full_group_by有关,并且有一些例子,它是什么意思here。在找到正确的解决方案之前,解决方案是将->addSelect('message')
添加到查询中(我不知道它是否修复了问题或者学说无论如何重写了查询),但是这样的学说也可以保持按摩,也许不希望或禁用ONLY_FULL_GROUP_BY sql模式,但是,mysql可能会返回无效数据。
答案 3 :(得分:2)
实际上,mysql 5.7包含' ONLY_FULL_GROUP_BY '在sql模式中。所以我们不能在不在select列表中的元素中执行orderby。我们必须从
更改它'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
到
'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
我们可以通过执行以下查询来完成此操作
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
谢谢,
素里亚
答案 4 :(得分:0)
使用QueryBuilder
时,联接的表格不会自动添加到选择列表中。您可以致电addSelect(TABLE_ALIAS)
以消除错误。
$queryBuilder = $this
->createQueryBuilder('recipient')
->leftJoin('recipient.message', 'message')
->addSelect('message') //THIS LINE
->orderBy('message.dateSent', 'DESC');
答案 5 :(得分:0)
将 Doctrine 更新到 2.8 应该可以解决这个问题。