从关系中检索SUM排序的模型结果

时间:2019-08-21 11:55:21

标签: laravel collections eloquent one-to-many

雄辩地使用Laravel,我有两个模型 Users UserSocialMediaChannels ,它们之间具有一对多的关系,类似于下面的示例。 我要实现的目标是按照每个用户拥有的总关注者数量来对用户进行排序。 例如,下面的示例中的结果应在userA之前显示userB,因为userB followers(25)大于usersA followers(15)

如何为每个用户汇总所有社交渠道的关注者,然后对结果进行排序?从数据库检索结果时,我需要这样做,以便分页的结果正确。

   for x in [df_train_data, df_test_data]:
       df_name = df_name[['uuid', 'parcel']].astype(str)

uid Name
10  userA
5   userB

id  uid   Name   channel name   followers
1   10    userA  Facebook          10
2   10    userA  Instagram          5
3    5    userB  Facebook          20
4    5    userB  Instagram          5

在下面的示例中,我只能成功获得至少一个频道的关注者值大于10的用户。

public function channels() {
    return $this->hasMany('App\Models\UserSocialMediaChannels', 'uid');
}
public function user() {
    return $this->belongsTo('App\Models\User', 'uid');
}

我也没有为每个用户尝试将所有频道关注者字段汇总为一个新字段而没有成功。想法是按此新字段对用户进行排序。

$users = \App\Models\User::with('channels');

$users->whereHas('channels', function($query){
      $query->havingRaw('SUM(followers) > ?', 10);
}

3 个答案:

答案 0 :(得分:0)

尝试以下查询:

$users = \App\Models\User::join('table_name', 'users.uid', '=', 'table_name.uid')
         ->select('users.*', DB::raw('SUM(followers) as total_followers'))
         ->orderBy('total_followers', 'DESC')
         ->get();

答案 1 :(得分:0)

您计算了所有followers,并将它们引用为totals,现在必须在查询中使用它们。这未经测试,但应该可以。

$users->whereHas('channels', function($query){
      $query->select(DB::raw('sum(followers) as totals'))
            ->orderBy('totals', 'ASC')
})->get();

答案 2 :(得分:0)

基本上,您想按照SUM关系中的关注者的belongsTo对父模型(用户)进行排序。为此,您需要首先在父模型的Select子句中获得SUM个关注者,以便您具有可以执行Order By的值。

$users = \App\User::with('channels')
            ->select('users.*', \DB::raw('(SELECT sum(followers) FROM channels WHERE users.id = channels.user_id ) as total_followers'))
            ->orderBy('total_followers', 'desc')
            ->get();