web-dev-qa-db-fra.com

La clause Doctrine Querybuilder ORDER BY n'est pas dans la liste SELECT

J'ai le constructeur de requête suivant:

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

Cela fonctionne très bien :) - mais depuis la mise à niveau vers Mysql 5.7, j'ai commencé à avoir cette erreur partout:

SQLSTATE [HY000]:
Erreur générale: 3065
L'expression n ° 1 de la clause ORDER BY n'est pas dans la liste SELECT, référence à la colonne 'dctrn_result.date_sent_5' qui n'est pas dans la liste SELECT;
Ceci est incompatible avec DISTINCT

J'ai résolu ce problème dans la plupart des endroits où j'utilise la couche DBAL en ajoutant simplement l'élément à la liste de sélection, mais je ne vois pas comment faire cela avec cette queryBuilder particulière.

10
Desi Cochrane

Vous devez éditer le /etc/mysql/mysql.cnf en ajoutant ces lignes:

[mysqld]
sql-mode=""

N'oubliez pas de redémarrer le service mysql:

Sudo service mysql restart

Pour info, j'utilise Ubuntu 16.04 LTS.

22
Amine Jallouli

Ajouter:

[mysqld]
sql-mode=""

à /etc/mysql/my.cnf résolu le problème pour moi (après le redémarrage du service). Bien sûr, une réponse officielle à la question de la { question de la doctrine } serait plus intéressante. 

Mise à jour: quelqu'un qui en sait plus que moi à ce sujet il est recommandé de désactiver uniquement le mode à l'origine du problème. } _

13
mickadoo

Il y a un bogue rapporté dans # 4846 et il semble être lié à #sqlmode_only_full_group_by et il y a quelques exemples abaut que signifie-t-il ici . Jusqu'à ce qu'une solution appropriée soit trouvée, la solution serait d'ajouter ->addSelect('message') à la requête (je ne sais pas si cela résout le problème ou si la doctrine réécrit la requête de toute façon), mais de cette façon la doctrine hydratera également les massages qui ne sont peut-être pas souhaités ou désactivés ONLY_FULL_GROUP_BY mode SQL, mais ensuite, mysql peut peut-être renvoyer des données invalides.

2
1ed

En fait, mysql 5.7 contient ' ONLY_FULL_GROUP_BY ' en mode sql. Nous ne pouvons donc pas exécuter orderby dans l'élément qui n'est pas dans la liste de sélection. Nous devons le changer de

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

dans

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

Nous pouvons le faire en exécutant les requêtes suivantes

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'

Merci,

Suriya

1
Suriya Kumar

Lorsque vous utilisez QueryBuilder, les tables jointes ne sont pas ajoutées automatiquement à la liste de sélection. Vous pouvez appeler addSelect(TABLE_ALIAS) pour supprimer l’erreur.

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