Doctrine Querybuilder ORDER BY clause is not in SELECT list

后端 未结 5 1438
清歌不尽
清歌不尽 2021-02-08 08:29

I have the following query builder:

$queryBuilder = $this
    ->createQueryBuilder(\'recipient\')
    ->leftJoin(\'recipient.message\', \'message\')
    -&         


        
相关标签:
5条回答
  • 2021-02-08 09:05

    There is a bug reported in #4846 and it seems to be related to #sqlmode_only_full_group_by and there are some examples abaut what does it mean here. Until a proper fix comes out a solution would be to add ->addSelect('message') to the query (I don't know if it fixes the issue or doctrine rewrites the query anyway), but that way doctrine will hydrate massages as well which maybe not desired or disable ONLY_FULL_GROUP_BY sql mode, but then, mysql maybe can return invalid data.

    0 讨论(0)
  • 2021-02-08 09:12

    Actually mysql 5.7 contains 'ONLY_FULL_GROUP_BY' in sql mode.So we can't perform orderby in the element that is not in select list.we have to change it from

    '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' 
    

    into

    'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    

    We can done this by executing the following queries

    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'
    

    Thanks,

    Suriya

    0 讨论(0)
  • 2021-02-08 09:13

    Adding:

    [mysqld]
    sql-mode=""
    

    to /etc/mysql/my.cnf fixed the problem for me (after restarting service). Although of course an official response to the doctrine issue would be nicer.

    Update: Someone who knows more than me about this recommended only disabling the mode that's causing the problem.

    0 讨论(0)
  • 2021-02-08 09:15

    When using QueryBuilder, joined tables are not added to the select list automatically. You can call addSelect(TABLE_ALIAS) to get rid of the error.

    $queryBuilder = $this
        ->createQueryBuilder('recipient')
        ->leftJoin('recipient.message', 'message')
        ->addSelect('message') //THIS LINE
        ->orderBy('message.dateSent', 'DESC');
    
    0 讨论(0)
  • 2021-02-08 09:17

    You have to edit the /etc/mysql/mysql.cnf by adding these lines:

    [mysqld]
    sql-mode=""
    

    Don't forget to restart the service mysql:

    sudo service mysql restart
    

    For info, I am using Ubuntu 16.04 LTS.

    0 讨论(0)
提交回复
热议问题