私は次のクエリビルダーを持っています:
$queryBuilder = $this
->createQueryBuilder('recipient')
->leftJoin('recipient.message', 'message')
->orderBy('message.dateSent', 'DESC');
これは正常に機能しています:)-しかし、Mysql 5.7
にアップグレードしてから、どこでもこのエラーが発生し始めました。
SQLSTATE [HY000]:
一般的なエラー:3065ORDER BY
句の式#1がSELECT
リストになく、SELECT
リストにない列'dctrn_result.date_sent_5'
を参照しています。
これはDISTINCT
と互換性がありません
選択リストにアイテムを追加するだけでDBAL
レイヤーを使用しているほとんどの場所でこれを解決しましたが、この特定のqueryBuilder
でそれを行う方法がわかりません。
次の行を追加して、/etc/mysql/mysql.cnf
を編集する必要があります。
[mysqld]
sql-mode=""
サービスmysqlを再起動することを忘れないでください:
Sudo service mysql restart
詳細については、Ubuntu 16.04LTSを使用しています。
追加:
[mysqld]
sql-mode=""
to /etc/mysql/my.cnf
(サービスを再起動した後)問題を修正しました。もちろん、 教義の問題 への公式の回答の方が良いでしょうが。
更新:これについて私よりも知っている人 問題の原因となっているモードのみを無効にすることをお勧めします。
実際、mysql5.7にはSQLモードで 'ONLY_FULL_GROUP_BY'が含まれているため、にない要素で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'
ありがとう、
スリヤ
#4846 で報告されたバグがあり、それは #sqlmode_only_full_group_by に関連しているようで、それが何を意味するのかを示すいくつかの例があります ここ 。適切な修正が行われるまで、解決策はクエリに->addSelect('message')
を追加することです(問題が修正されるか、doctrineとにかくクエリを書き換えるかはわかりません)、しかし、そうすればdoctrineはマッサージも水和し、望ましくないか、ONLY_FULL_GROUP_BY sqlモードを無効にしますが、mysqlは無効なデータを返す可能性があります。
QueryBuilder
を使用する場合、結合されたテーブルは選択リストに自動的に追加されません。 addSelect(TABLE_ALIAS)
を呼び出して、エラーを取り除くことができます。
$queryBuilder = $this
->createQueryBuilder('recipient')
->leftJoin('recipient.message', 'message')
->addSelect('message') //THIS LINE
->orderBy('message.dateSent', 'DESC');