2017-02-08 3 views
2

次のように見えた私が持っていた古き良きコードに起因のMySQL 5.7以上の変化に、SQLモードONLY_FULL_GROUP_BYがデフォルトで有効になっているようだ:特定の列に基づいてすべての個別の行を取得するにはどうすればよいですか?

...

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->groupBy('name') 
    ->get(); 

が今エラーがスローされます

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 

私のコードをさまざまな方法で更新して、動作させることを試みましたが、運がないようにしました。

これは私が現在持っているものです。

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->selectRaw('name, ANY_VALUE(id), ANY_VALUE(col_a), ANY_VALUE(col_b), ANY_VALUE(col_c), ANY_VALUE(col_d)') 
    ->groupBy('name') 
    ->get(); 

は、これはすべてのエラーをスローしませんが、列データが欠落しています。

私も試してみた:

「名前」に基づいて個別の行を返さない
Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->groupBy('name') 
    ->groupBy('id') 
    ->get(); 

を。それはただすべてを返します。

Laravel Eloquentまたはraw MySQLでこれを行うにはどうすればよいですか?

+0

あなたは ' - > distinct() - > get();'を試しましたか – EddyTheDove

+0

私はdistinct()も調べました。しかし、1つの行だけを返します。私は複数の行を取得しようとしています。 – rotaercz

答えて

0

groupBy()メソッドは、コレクションのアイテムを所定のキーでグループ化します。 'strict' => false,config/database.phpファイルの変更'strict' => true,

Table::where('name', 'LIKE', '%'.$search_str.'%') 
    ->get() 
    ->groupBy('name'); 
+0

これはまだすべての結果をグループに戻しています。私は名前に基づいて別個の行だけを必要とします。クエリ自体がすべてを処理できるのが最善の方法です。これには、データベースに当たってからクエリ結果を操作する必要がありますので、処理速度も遅くなります。 – rotaercz

+0

@rotaerczそのために: 'Table :: select( 'name') - > groupBy( '​​name') - > get();' –

+0

それはすべての列で完全な行が必要なので動作しません。列には一意の値がある場合とない場合があります。 – rotaercz

0

と私はあなたがこのために探している場合はわからない

Table::where('name', 'LIKE', '%'.$search_str.'%') 
->groupBy('name') 
->get(); 

を試してみてください:あなたは、最初のコレクションを取得する必要があります。

+0

それはおそらく動作しますが、私はそれを厳密に保ち、それを動作させたいと思います。 – rotaercz

関連する問題