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



与Laravel雄辩合作,我有两个模型UserUserSocialMediaChannels,它们具有类似于下面示例的1对多关系。 我试图实现的是按每个用户拥有的总关注者数量对用户进行排序。 例如,示例波纹管中的结果应显示用户 B 在用户 A 之前,因为用户 B 关注者 (25( 大于用户 A 关注者 (15(

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

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

public function channels() {
return $this->hasMany('AppModelsUserSocialMediaChannels', 'uid');
}
public function user() {
return $this->belongsTo('AppModelsUser', 'uid');
}

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

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

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

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

基本上,您希望根据belongsTo关系中的追随者的SUM对父模型(用户(进行排序。为此,您需要首先在父模型的 Select 子句中获取追随者的SUM,以便获得可以对其执行排序依据的值。

$users = AppUser::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(); 

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

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

最新更新