2016-08-27 4 views
2

次のクエリはLaravel 5.2では動作しますが、Laravel 5.3では動作しません。Laravel 5.3 groupBy()壊れていますか?

$messages = Message::with('sender.profile', 'recipient.profile') 
    ->where('sender_id', 1) 
    ->orWhere('recipient_id', 1) 
    ->groupBy('thread') 
    ->get(); 

5.3で実行した場合、あなたはそれがデータベースの問題だと言う前に、私が覚えて、今、次のエラーメッセージ

SQLSTATE[42000]: Syntax error or access violation: 1055 
'tmp_laravel.messages.id' isn't in GROUP BY (SQL: select * from `messages` 
where `sender_id` = 1 or `recipient_id` = 1 group by `thread`) 

を受け取る:この同じクエリが同じデータベース上Laravel 5.2で動作します。だから、私のバージョンのMariaDBがL5.2でうまく動かないはずです。

さらに、Sequel Proで直接クエリを実行した場合は機能します。

実際、私がアプリをアップグレードするときにやったことではないことを確かめるために、Laravelの新しいコピーを2つインストールしました:5.2と5.3。コントローラ、モデル、ルート、.envなどまでは全く同じコードをインストールし、各バージョンで再度クエリを実行しました。同じ結果:L5.2で動作し、L5.3で動作します。

答えて

2
select * from `messages` 
where `sender_id` = 1 
    or `recipient_id` = 1 
group by `thread` 

このクエリは有効ではありませんが、厳密なモードが無効のMySQL/MariaDBでは「有効」です。 Laravelはサーバーのデフォルト設定を使用しません。 config/database.phpを変更して、

'strict' => false, 

をMySQL設定で設定する必要があります。

ただし、スレッドごとの最初/最後のメッセージを明示的に選択するには、そのクエリを書き直すことを検討する必要があります。

+0

私はあなたのアドバイスを受け取り、新しいクエリを見つけます。ありがとう! – timgavin

+0

書き換えに何をお勧めしますか? – timgavin

+0

@timgavin - 新しい質問を書いてください。これは厳密なモードと設定に関するものです。 "グループごとに最新の/最古のエントリを選択する方法"のように、多くの回答があります。 MySQLの場合しかし、私はララベルの解決策を見ていません。ここに新しい質問へのリンクを投稿すると、後でそれを見ていきます。 –