如何使这个mySql查询适应Laravel Elount
我在做搜索功能,想按总视图对帖子进行排序-每个视图行等于帖子的1个视图。我做了一个查询,它在MySQL中完全可以单独工作,但无法为Laravel重新生成。 有帖子和视图,我试图计算每个帖子的视图,并通过添加到帖子中来加入它们 MySQL查询:如何使这个mySql查询适应Laravel Elount,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我在做搜索功能,想按总视图对帖子进行排序-每个视图行等于帖子的1个视图。我做了一个查询,它在MySQL中完全可以单独工作,但无法为Laravel重新生成。 有帖子和视图,我试图计算每个帖子的视图,并通过添加到帖子中来加入它们 MySQL查询: SELECT posts.*, ( SELECT COUNT(*) FROM views WHERE template_id = 9 AND real_object_id = posts.id ) AS view
SELECT posts.*,
(
SELECT COUNT(*)
FROM views
WHERE template_id = 9 AND real_object_id = posts.id
)
AS viewsTotal
FROM posts
ORDER BY viewsTotal DESC
此查询执行作业并返回:
id(post id), ..other post columns.., viewsTotal
5 5
3 3
4 2
9 1
8 0
10 0
11 0
12 0
13 0
问题在于,将其调整为Laravel查询时,只返回至少有一个视图行的POST结果:
id(post id), ..other post columns.., viewsTotal
5 5
3 3
4 2
9 1
其他没有意见的帖子也会丢失,这不是我想要的
Laravel雄辩的查询内部搜索方法:
$posts = new Post;
// ... some other filters set in if statements if request fields are set
$posts->where('type', $request->filterType);
// and then sort if statement is always called
if(isset( $request->sortByWhat ))
{
if( $request->sortByWhat === "new" ){
$posts = $posts->orderBy('created_at', 'desc');
}
else if ($request->sortByWhat === "pop") {
$objectTemplateId = ObjectTemplate::where('title', 'post')->first()->id;
$posts = $posts
->select('posts.*')
->leftJoin('views', 'posts.id', '=', 'views.real_object_id')
->where('views.template_id', '=', $objectTemplateId)
->addSelect(DB::raw('count(views.real_object_id) as viewsTotal'))
->groupBy('posts.id')
->orderBy('viewsTotal', 'desc');
# dd($posts->toSql());
# "select `posts`.*, count(views.real_object_id) as viewsTotal from `posts`
# left join `views` on `posts`.`id` = `views`.`real_object_id` where `views`.`template_id` = ?
# group by `posts`.`id` order by `viewsTotal` desc"
}
}
$posts = $posts->paginate(5);
$posts = $this->getPostImpressionsSearch($posts);
return response()->json([
'success' => true,
'posts' => $posts
]);
有POST、objectsTemplates和views表
职位有:
Id、标题、内容、类型、用户Id、时间戳
意见如下:
身份证件
模板化的_id(9,表示其Posts表),
real_object_id(post id,因为它的posts表行正确地知道,可以是article id、list id…),
用户id,
时间戳
p.S.ObjectsTemplates类似于视图表的指示器,因此我不需要为文章、列表和所有其他资源创建单独的视图表:
id(在本例中为9)
title(“Posts”)我假设
$objectsCollection
这里是类似于Posts::query()
?@apokryfos是的,为了更清晰起见进行了一点更正。您是否尝试使用join
而不是leftJoin
?您能否执行dd(第二次查询->toSql())
并分享laravel实际制作的内容?我还担心,groupBy
可能会破坏apokryfos添加的paginate
@apokryfos。选择posts
*,计数(视图.真实对象\u id)从posts
left joinviews
onposts
id
views
real\u object\u id
其中视图模板id
按posts
分组我假设$objectsCollection
这里有类似于Posts::query()
?@apokryfos是的,为了更清晰起见进行了一点更正。您是否尝试使用join
而不是leftJoin
?您是否可以执行dd(第二次查询->toSql())
并分享laravel实际制作的内容?我还担心,groupBy
可能会破坏apokryfos添加的paginate
@apokryfos。选择posts
*,计数(视图.真实对象\u id)从posts
left joinviews
onposts
id
views
real\u object\u id
其中视图模板id
按posts
分组