Select 全部来自第一个 table 并按 Count(id) 从第二个 table 排序,其中 second.value = 1

Select all from first table and order by Count(id) from second table where second.value = 1

有两个table视频反应

我想按喜欢的降序对视频进行排序。 反应 table 好恶相同。 (我不想为喜欢和不喜欢创建两个不同的 table)。 reaction 列在 reactions table 中 reaction = 1 表示 likes , reaction = 2表示不喜欢

问题是我的代码没有 where('reactions.reaction', 1) returns 所有视频都按总反应 (likes + disslikes) 排序,我只需要按 likes.[=21= 排序]

如果添加 where('reactions.reaction', 1) 那么我的查询将 returns 仅包含喜欢的视频而不是所有视频。

我想从 table 中获取所有视频按喜欢排序,而不仅仅是喜欢的视频。 我该怎么办?

$videos = Video::select('videos.id', DB::raw('count(reactions.id) as total'))
->leftJoin('reactions', 'reactions.at_video', '=', 'videos.id')
// ->where('reactions.reaction', 1) // I need this for only reactions
->groupBy('videos.id')
->orderBy('total', 'DESC')
->get();

dd($videos);

非常感谢 fake97 的解决方案。

我需要改变 ->where('reactions.reaction', 1)>where(function ($q){ $q->where('reactions.reaction', 1)->orWhereNull(''reactions.reaction');})

见下方代码

$videos = Video::select('videos.id', DB::raw('count(reactions.id) as total'))
->leftJoin('reactions', 'reactions.at_video', '=', 'videos.id')
->where(function ($q){ 
  $q->where('reactions.reaction', 1)->orWhereNull('reactions.reaction');
})
->groupBy('videos.id')
->orderBy('total', 'DESC')
->get();
      
dd($videos);