与Laravel雄辩合作,我有两个模型User和UserSocialMediaChannels,它们具有类似于下面示例的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();