Laravel:orderBy喜欢count

Laravel:orderBy喜欢count

问题描述:

Right so on my website, registered users can create posts and like other peoples posts. When displaying all the posts i have options where the users can sort by title, date and like count. I have done the title and date but im having trouble with sorting by like count. What would be the best way to implement this feature into my system.

This is my post controller method for retrieving and ordering the posts:

public function getEvents(Request $request){

    if($request['sort'] == "created_at"){
        $posts = Post::orderBy('created_at', 'desc')->get();
    }
    elseif($request['sort'] == "title"){
        $posts = Post::orderBy('title', 'desc')->get();
    }
    elseif($request['sort'] == "like"){

        //how would I go about ordering by like count here
    }
    return view ('eventspage',  ['posts' => $posts]);
}

Here is my view where users select what to order by:

<form action="{{ route('events') }}">    
    <select name="sort" onchange="this.form.submit()" class="form-control">
        <option value="">Sort By</option>
        <option value="created_at">Date</option>
        <option value="title">Title</option>
        <option value="like">Likes</option>
        <input type="hidden" name="formName" value="sort">
    </select>
</form>

因此,在我的网站上,注册用户可以创建帖子和其他人的帖子一样。 当显示所有帖子时,我有选项,用户可以按标题,日期和类似计数进行排序。 我已经完成了标题和日期,但我很难按照计数排序。 在我的系统中实现此功能的最佳方法是什么。 p>

这是我的帖子控制器方法,用于检索和订购帖子: p>

  public function getEvents(Request $ request){
 
 if($ request ['sort'] ==“created_at”){
 $ posts = Post :: orderBy('created_at','desc') -  &gt; get(); 
} 
 elseif($ request ['sort'] ==“title”){
 $ posts = Post :: orderBy('title','desc') - &gt; get(  ); 
} 
 elseif($ request ['sort'] ==“like”){
 
 //我将如何通过类似计数进行排序
} 
返回视图('eventspage'  ,['posts'=&gt; $ posts]); 
} 
  code>  pre> 
 
 

以下是我的观点,用户选择订购的内容: p> \ n

 &lt; form action =“{{route('events')}}”&gt;  
&lt; select name =“sort”onchange =“this.form.submit()”class =“form-control”&gt; 
&lt; option value =“”&gt; Sort By&lt; / option&gt; 
&lt;  ; option value =“created_at”&gt; Date&lt; / option&gt; 
&lt; option value =“title”&gt; Title&lt; / option&gt; 
&lt; option value =“like”&gt; Likes&lt; / option&gt; 
  &lt; input type =“hidden”name =“formName”value =“sort”&gt; 
&lt; / select&gt; 
&lt; / form&gt; 
  code>  pre> 
  div>

Use this:

$posts = Post::withCount('likes')->orderByDesc('likes_count')->get();

This requires a likes relationship in the Post model:

public function likes() {
    return $this->hasMany(Like::class);
}