我有这个控制器从邮局表中抓取帖子。 帖子表中的每个帖子都有关系" 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)之类的帖子之后。
答案 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();