Laravel Order results by conditional counting Pivot Table

I’ve a posts table with following structure

id title description
1 Post A Description A
2 Post B Description B

reactions table with following structure:

id title url
1 Like http://like_url
2 Dislike http://dislike_url

And post_reactions pivot table with following structure

post_id user_id reaction_id
1 1 1
1 2 1
2 1 2

How can I achieve posts table result OrderBy Max Count of ReactionID?

For e.g.

  • By ordering with reactionId = 1, the result should be:
[
  {
    id: 1,
    title: 'Post A',
    description: 'Description A'
    reaction_count: 2         // count of reactionId=1 is maximum here
  },
  {
    id: 2,
    title: 'Post B',
    description: 'Description B'
    reaction_count: 1         
  } 
]
  • By ordering with reactionId = 2, the result should be:
[
{
    id: 2,
    title: 'Post B',
    description: 'Description B'
    reaction_count: 1      // count of reactionId=2 is maximum here 
  },
  {
    id: 1,
    title: 'Post A',
    description: 'Description A'
    reaction_count: 2         
  },
]

What I’d tried is:

// Post Model
public function reactions(): BelongsToMany
    {
        return $this->belongsToMany(Reaction::class)->withPivot('user_id');
    }

// Controller
Post::with(['post_reactions' => function ($query) use ($reactionId) {
  $query->where('post_reactions.reaction_id', $reactionId)
        ->select(DB::raw('count(post_reactions.reaction_id) as reaction_count'))
        ->get();
}])->get();