2016-02-27 18 views
9

Ho la seguente generatore di query:Dottrina QueryBuilder clausola ORDER BY non è nell'elenco SELECT

$queryBuilder = $this 
    ->createQueryBuilder('recipient') 
    ->leftJoin('recipient.message', 'message') 
    ->orderBy('message.dateSent', 'DESC'); 

Questa :) ha lavorato bene - ma dal momento che l'aggiornamento a Mysql 5.7 ho cominciato a ricevere questo errore ovunque:

SQLSTATE[HY000]:
General error: 3065
Expression #1 of ORDER BY clause is not in SELECT list, references column 'dctrn_result.date_sent_5' which is not in SELECT list;
this is incompatible with DISTINCT

ho risolto questo nella maggior parte dei luoghi in cui sto usando lo strato DBAL semplicemente aggiungere l'articolo alla lista di selezione, ma non riesco a capire come fare con questo particolare queryBuilder.

+0

Una soluzione che ho trovato e ha lavorato anche per me è descritto [qui] (http://stackoverflow.com/a/40000429/572801) – cwhisperer

risposta

1

C'è un bug segnalato in #4846 e sembra essere correlato a #sqlmode_only_full_group_by e ci sono alcuni esempi abaut che cosa significa here. Fino a quando non viene trovata una soluzione adeguata, la soluzione è aggiungere ->addSelect('message') alla query (non so se risolve il problema o la dottrina riscriva comunque la query), ma in quel modo la doctrina idratherà anche i massaggi che forse non sono desiderati o disabilitati ONLY_FULL_GROUP_BY sql mode, ma in seguito mysql può restituire dati non validi.

21

È necessario modificare il /etc/mysql/mysql.cnf aggiungendo queste righe:

[mysqld] 
sql-mode="" 

Non dimenticare di riavviare il servizio di mysql:

sudo service mysql restart 

Per informazioni, sto usando Ubuntu 16.04 LTS.

+1

Questo ha funzionato per me, grazie :) – lock

+0

Questo ha funzionato .. Ma perché? –

0

realtà MySQL 5.7 contiene 'ONLY_FULL_GROUP_BY' in SQL mode.So non siamo in grado di eseguire orderby nell'elemento che non è nel selezionare list.we deve cambiare da

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

in

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

Possiamo fatto eseguendo le seguenti query

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' 

Grazie,

Suriya

0

Quando si utilizza QueryBuilder, unite le tabelle non vengono aggiunti all'elenco di selezione automaticamente. È possibile chiamare addSelect(TABLE_ALIAS) per eliminare l'errore.

$queryBuilder = $this 
    ->createQueryBuilder('recipient') 
    ->leftJoin('recipient.message', 'message') 
    ->addSelect('message') //THIS LINE 
    ->orderBy('message.dateSent', 'DESC'); 
Problemi correlati