web-dev-qa-db-ja.com

Doctrine Querybuilder ORDERBY句がSELECTリストにありません

私は次のクエリビルダーを持っています:

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

これは正常に機能しています:)-しかし、Mysql 5.7にアップグレードしてから、どこでもこのエラーが発生し始めました。

SQLSTATE [HY000]:
一般的なエラー:3065
ORDER BY句の式#1がSELECTリストになく、SELECTリストにない列'dctrn_result.date_sent_5'を参照しています。
これはDISTINCTと互換性がありません

選択リストにアイテムを追加するだけでDBALレイヤーを使用しているほとんどの場所でこれを解決しましたが、この特定のqueryBuilderでそれを行う方法がわかりません。

11
Desi Cochrane

次の行を追加して、/etc/mysql/mysql.cnfを編集する必要があります。

[mysqld]
sql-mode=""

サービスmysqlを再起動することを忘れないでください:

Sudo service mysql restart

詳細については、Ubuntu 16.04LTSを使用しています。

22
Amine Jallouli

追加:

[mysqld]
sql-mode=""

to /etc/mysql/my.cnf(サービスを再起動した後)問題を修正しました。もちろん、 教義の問題 への公式の回答の方が良いでしょうが。

更新:これについて私よりも知っている人 問題の原因となっているモードのみを無効にすることをお勧めします。

15
mickadoo

実際、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'

ありがとう、

スリヤ

2
Suriya Kumar

#4846 で報告されたバグがあり、それは #sqlmode_only_full_group_by に関連しているようで、それが何を意味するのかを示すいくつかの例があります ここ 。適切な修正が行われるまで、解決策はクエリに->addSelect('message')を追加することです(問題が修正されるか、doctrineとにかくクエリを書き換えるかはわかりません)、しかし、そうすればdoctrineはマッサージも水和し、望ましくないか、ONLY_FULL_GROUP_BY sqlモードを無効にしますが、mysqlは無効なデータを返す可能性があります。

2
1ed

QueryBuilderを使用する場合、結合されたテーブルは選択リストに自動的に追加されません。 addSelect(TABLE_ALIAS)を呼び出して、エラーを取り除くことができます。

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