拉拉维尔订单按关系计数

2022-08-30 08:20:58

我正在尝试获得最受欢迎的黑客马拉松,这需要由相应的黑客马拉松订购。抱歉,如果这有点难以理解。partipants->count()

我有一个具有以下格式的数据库:

hackathons
    id
    name
    ...

hackathon_user
    hackathon_id
    user_id

users
    id
    name

模型是:Hackathon

class Hackathon extends \Eloquent {
    protected $fillable = ['name', 'begins', 'ends', 'description'];

    protected $table = 'hackathons';

    public function owner()
    {
        return $this->belongsToMany('User', 'hackathon_owner');
    }

    public function participants()
    {
        return $this->belongsToMany('User');
    }

    public function type()
    {
        return $this->belongsToMany('Type');
    }
}

并定义为:HackathonParticipant

class HackathonParticipant extends \Eloquent {

    protected $fillable = ['hackathon_id', 'user_id'];

    protected $table = 'hackathon_user';

    public function user()
    {
        return $this->belongsTo('User', 'user_id');
    }

    public function hackathon()
    {
        return $this->belongsTo('Hackathon', 'hackathon_id');
    }
}

我试过了,但我觉得我犯了一个大错误(可能是$this>id),因为它根本不起作用。Hackathon::orderBy(HackathonParticipant::find($this->id)->count(), 'DESC')->take(5)->get());

我该如何尝试获得基于相关黑客马拉松参与者数量最多的最受欢迎的黑客马拉松?


答案 1

这在Laravel 5.3中适用于我,使用您的示例:

Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10); 

这样,它对查询进行排序,并且分页可以很好地工作。


答案 2

另一种方法可能是使用方法。withCount()

Hackathon::withCount('participants')
        ->orderBy('participants_count', 'desc')
        ->paginate(50);

编号: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations


推荐