1. ホーム
  2. php

Laravel OrderByのリレーションシップ数

2023-11-18 16:24:38

質問

私は最も人気のあるハッカソンを取得しようとしていますが、それにはそれぞれのハッカソンの 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)をしたような気がしています。

関連する hackathonParticipants の最も多い数に基づいている最も人気のある hackathons を取得しようとする場合、どうすればよいでしょうか?

どのように解決するのですか?

編集:Laravel 5.2以降を使用している場合、kJamesyの回答を使用してください。 参加者とハッカソンをすべてメモリにロードする必要がなく、ページ分割されたハッカソンとそれらのハッカソンの参加者数だけなので、おそらくもう少しうまくいくでしょう。

を使用することができるはずです。 Collection 's sortBy()count() メソッドを使用すると、かなり簡単にこれを行うことができます。

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