如何使这个mySql查询适应Laravel Elount

如何使这个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

我在做搜索功能,想按总视图对帖子进行排序-每个视图行等于帖子的1个视图。我做了一个查询,它在MySQL中完全可以单独工作,但无法为Laravel重新生成。 有帖子和视图,我试图计算每个帖子的视图,并通过添加到帖子中来加入它们

MySQL查询:

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 join
views
on
posts
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 join
views
on
posts
id
views
real\u object\u id
其中
视图
模板
id
posts
分组