Doctrine Querybuilder ORDER BY子句不在SELECT列表中

时间:2016-02-27 14:33:07

标签: mysql symfony doctrine-orm

我有以下查询构建器:

$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 }}

6 个答案:

答案 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 应该可以解决这个问题。