【问题标题】:Retrive model results ordered by SUM from relationship从关系中检索按 SUM 排序的模型结果
【发布时间】:2019-12-26 16:46:23
【问题描述】:

使用 Laravel eloquent 我有两个模型 UsersUserSocialMediaChannels,它们具有一对多的关系,类似于下面的示例。 我想要实现的是让用户按每个用户拥有的总关注者数量排序。 例如,下面示例中的结果应在 userA 之前显示 userB,因为 userB 的关注者(25)大于 usersA 的关注者(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('App\Models\UserSocialMediaChannels', 'uid');
}
public function user() {
    return $this->belongsTo('App\Models\User', 'uid');
}

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

$users = \App\Models\User::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'));
});

【问题讨论】:

  • 使用最后一个$users 查询时,是否出现任何错误,或者数据未显示?
  • @zlatangoralija 我没有收到任何错误,数据和以前一样,但我没有在任何地方看到新字段 totals

标签: laravel collections eloquent one-to-many


【解决方案1】:

基本上,您希望根据belongsTo 关系中的关注者的SUM 对父模型(用户)进行排序。为此,您需要首先在父模型的 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(); 

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为这也可以。当 dd($users) 时,我看不到集合中任何地方引用的 totals,并且结果未排序。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2019-03-15
    • 2018-12-24
    • 2021-02-10
    • 1970-01-01
    • 2012-08-03
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多