2017-05-04 7 views
3

マイlaravelの雄弁は、このようなものです:laravel雄弁のsql_mode = only_full_group_byとの互換性をどのように解決できますか?

$products = Product::where('status', 1) 
      ->where('stock', '>', 0) 
      ->where('category_id', '=', $category_id) 
      ->groupBy('store_id') 
      ->orderBy('updated_at', 'desc') 
      ->take(4) 
      ->get(); 

実行すると、このようなエラーが存在する:

SQLSTATE [42000]:構文エラーまたはアクセス違反:SELECTリストの1055年式#1 GROUP BY句には含まれておらず、集約されていない カラム 'myshop.products.id'を含みます。これは機能的にGROUP BY句の カラムに依存しません。私はそれを解決するにはどうすればよい

:これは sql_modeの= ONLY_FULL_GROUP_BY(updated_at DESC限界4によってstore_id 順序によってproductsここ status = 1とstock> 0とcategory_id = 5群から選択* SQL)と互換性がありません?

答えて

0

チェッククエリ:ここ

Product::where('status', 1) 
      ->where('stock', '>', 0) 
      ->where('category_id', '=', $category_id) 
      ->groupBy('store_id') 
      ->orderBy('updated_at', 'desc') 
      ->take(4) 
      ->get(); 

あなたはstore_idでデータをグループ化し、許可されていない結果セット内のすべての列をフェッチしています。これを解決するには、store_idを選択するか、システム変数sql_mode=only_full_group_bySET sql_mode = ''に変更してください。 MySQLの最新バージョンがすでにgroup by条項に関してんほとんどのDBMSのように振る舞うためだ

Reference

+0

でさらに多くの構成設定を見つけることができます: 'updated_atののDESC限界によってSTORE_ID注文して、ステータス= 1と株式> 0とCATEGORY_ID = 5グループの製品から選択* mysqlの「4」は動作します。したがって、このエラーは雄弁なlaravelを介しているようです。 –

0

。一般的なルールは、あなたがgroup byを使用している場合は、あなたのselect内のすべての列が

(ように avgsumcountと)集計関数によって集計 group byかに存在でなければなりません

です

現在のクエリはstore_idでグループ化されていますが、すべてを選択しているため、上記のルールは尊重されません。

+0

私がこのクエリを実行すると、 'select * from products where status = 1かつstock> mysqlのcategory_id = 5 group by store_id order by updated_at desc limit 4'それはエラーが忠実なlaravel –

12

私も同様の問題があり、データベース接続設定でmysql strictモードを無効にして解決しました。

'connections' => [ 
    'mysql' => [ 
     // Behave like MySQL 5.6 
     'strict' => false, 

     // Behave like MySQL 5.7 
     'strict' => true, 
    ] 
] 

私はこのクエリを実行する場合は、this blog post by Matt Stauffer

+0

を経由しているようです。私たちが 'strict' => falseにした場合、セキュリティバグ – DPS

+0

がここに来て無駄になってしまい、これが私の問題を解決しました。 –