一尘不染

Laravel OrderBy关系计数

mysql

我正在尝试获得最受欢迎的黑客马拉松,这需要通过各自的黑客马拉松订购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');
    }
}

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

我将如何尝试获取基于最多的相关hackathon参与者的最受欢迎的hackathon?


阅读 407

收藏
2020-05-17

共1个答案

一尘不染

编辑:如果使用Laravel
5.2或更高版本,请使用kJamesy的答案。它的性能可能会好一些,因为它不需要将所有参与者和hackathon加载到内存中,仅需要分页的hackathon和这些hackathon的参与者数。

您应该可以使用CollectionsortBy()count()方法来轻松完成此操作。

$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon)
{
    return $hackathon->participants->count();
});
2020-05-17