2016-12-09 12 views
2

私は2つのテーブルusersとuser_actionsを持っています。私はすべてのユーザーを( '利用可能'、真)(...と他のロジック)に取得し、user_actions.clicks列の合計でそれらを注文する必要があります。結果は、UserクラスのコレクションでなければなりませんLaravel 5.3。 - where節とorderByのrelationからsum( 'column')を使用する方法

User::where('available', true)->where("something else....")->orderBy('sum(user_actions.clicks)', 'desc')->get(); 

public function actions() 
{ 
     return $this->hasMany(UserActions::class); 
} 

私はこのようなものが必要。

答えて

1

ような何かを行うことができますあなたはとorderByDB::rawを試すことができます。

User::where('available', true) 
    ->where("something else....") 
    ->join('user_actions', 'users.id', '=', 'user_actions.user_id') 
    ->orderBy(DB::raw("sum('user_actions.clicks')")) 
    ->groupBy('users.id') 
    ->select('users.*') 
    ->get(); 

それともとして、コレクションのsortBy方法を使用することができます

User::where('available', true)->with('user_actions')->get() 
    ->sortBy(function ($user) { 
     return $user->user_actions->sum('clicks'); 
    }); 

一般的には、データベースの終わりですが、この方法はプロセスを大幅に簡素化するので価値があります。

+0

ありがとう、これも私の最初の解決策でしたが、私が参加する場合、私はこのエラーを受け取ります: "構文エラーまたはアクセス違反:1055 'compari_ci.users.created_at'はGROUP BYにありません..." created_atは別のものですユーザーテーブルのフィールド。私はLaravel 5.3 btwを使用しています。 –

+0

これはMySQLに関連しています。この回答を確認してくださいhttp://stackoverflow.com/questions/34115174/error-related-to-only-full-group-by-when-executing-a-query-in-mysql –

+0

これを行うと、私は'user_actions.user_id '、' = '、' users.id '); $ query-> join(' user_actions '、' user_actions.user_id '、' = '、' users.id '); $ query-> selectRaw( 'クリック数としてsum(user_actions.clicks)'); $ query-> groupBy( '​​user_id'); $ query-> orderBy( '​​clicks'、 'desc'); ' –

0

あなたは

->selectRaw('user_actions.clicks, sum(user_actions.clicks) as clicks') 
->where('available', true)->where("something else....") 
->orderBy('clicks', 'desc'); 
+0

users.idでグループ化しないと、すべてのクリックのうちの「SUM」を含む行が1つしか得られません。 –

関連する問題