在Laravel中按总和列关系排序

时间:2016-12-18 15:15:45

标签: laravel

我有这个控制器从邮局表中抓取帖子。 帖子表中的每个帖子都有关系" hasMany"与另一个表喜欢

控制器:

public function getDashboard(){
        $posts = Post::orderBy('created_at', 'desc')->get(); 

        return view('dashboard', ['posts' => $posts]);
}

我想替换在'创建的'有类似的东西:

$post->likes->sum(like)

不知道如何编写正确的语法。

修改

以下是表格。

Posts  
--id   
--body  
Likes 
--id  
--post_id  
--like

可以具有值1或-1。 我想订购每个帖子的那一栏的总和。 因此,一个不喜欢(-1)和一个喜欢(1)的帖子的聚合值为0,因此将放在一个像(1)之类的帖子之后。

2 个答案:

答案 0 :(得分:2)

您可以将withCount()用作:

Post::withCount('likes')->orderBy('likes_count')->get()
  

withCount()会在您的结果上放置{relation} _count列   模型

<强>更新

Post::withCount(['likes' => function($q) {
    $q->where('like', 1)
}])
->orderBy('likes_count')
->get()

<强> UPDATE2

您可以使用sortByDesc()将收藏集排序为:

$posts = Post::get();

$posts = $posts->sortByDesc(function ($post) {
            return $post->likes->sum('like');
        });

答案 1 :(得分:0)

如果您想对关系中的列值求和,然后对记录进行排序。

$users = User::addSelect(['likes' => Post::selectRaw('sum(likes) as total_likes')
     ->whereColumn('user_id', 'useres.id')
     ->groupBy('user_id')
 ])
 ->orderBy('likes', 'DESC')
 ->get()
 ->toArray();

或者 下面使用

$users = User::select("*", 
               \DB::raw('(SELECT SUM(likes) FROM likes_table WHERE likes_table.user_id = users.id) as tolal_likes'))
        ->orderBy('likes', 'DESC')
        ->get()
        ->toArray();