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 clauseORDER BY
n'est pas dans la listeSELECT
, référence à la colonne'dctrn_result.date_sent_5'
qui n'est pas dans la listeSELECT
;
Ceci est incompatible avecDISTINCT
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.
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.
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. } _
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.
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
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');