Laravel OrderBy 관계 수
각 해커톤에서 주문해야 하는 가장 인기 있는 해커톤을 구하려고 합니다.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)를 한 것 같습니다.왜냐하면 전혀 동작하지 않기 때문입니다.
가장 많은 관련 해커톤 참가자를 기반으로 가장 인기 있는 해커톤을 얻으려면 어떻게 해야 할까요?
Larabel 5.3에서는, 다음의 예를 사용해 주세요.
Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10);
이렇게 하면 쿼리에서 순서가 매겨져 페이지 매김이 잘 됩니다.
또 다른 접근법은withCount()
방법.
Hackathon::withCount('participants')
->orderBy('participants_count', 'desc')
->paginate(50);
참고 자료: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations
편집: Larabel 5.2 이상을 사용하는 경우 kJamesy의 답변을 사용합니다.모든 참가자와 해커톤을 메모리에 로드할 필요가 없기 때문에 조금 더 성능이 향상될 것입니다. 페이지화된 해커톤과 해커톤의 참가자 수만 로딩할 필요가 없기 때문입니다.
를 사용할 수 있어야 합니다.Collection
의sortBy()
그리고.count()
이 일을 꽤 쉽게 할 수 있는 방법들.
$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon)
{
return $hackathon->participants->count();
});
이전 솔루션에서 Sabrina Gelbart가 코멘트한 것처럼 sortBy()를 사용하는 것은 페이지화 때문에 적합하지 않습니다.그래서 저는 db raw를 사용했고, 다음은 간단한 질의입니다.
Tag::select(
array(
'*',
DB::raw('(SELECT count(*) FROM link_tag WHERE tag_id = id) as count_links'))
)->with('links')->orderBy('count_links','desc')->paginate(5);
join 연산자를 사용할 수도 있습니다.Sabrina가 말했듯이 DB 레벨에서는 sortby를 사용할 수 없습니다.
$hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id')
->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`')
->groupBy('hackathon.id')
->orderBy('count','DESC')
->paginate(5);
하지만 이 코드는 데이터베이스에서 모든 기록을 가져갑니다.그래서 수동으로 페이지 번호를 매겨야 합니다.
$hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id')
->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`')
->groupBy('hackathon.id')
->orderBy('count','DESC')
->skip(0)->take(5)->get();
출처 : https://stackoverflow.com/a/26384024/2186887
여러 개의 카운트를 합산하여 순서를 정하기 위해 사용해야 했습니다.라라벨 8에서 다음 질문이 나에게 효과가 있었다.
$posts = Post::withCount('comments','likes')->orderBy(\DB::raw('comments_count + likes_count'),'DESC')->get();
아래 코드를 사용할 수 있습니다.
Hackathon::withCount('participants')->orderByDesc("participants_count")->paginate(15)
또한 단일 방법으로 ASC/DESC를 원하는 경우에도
Hackathon::withCount('participants')->orderBy("participants_count", 'asc')->paginate(15)
언급URL : https://stackoverflow.com/questions/24208502/laravel-orderby-relationship-count
'programing' 카테고리의 다른 글
서버에서 mod_rewrite가 활성화 되어 있는지 확인하는 방법 (0) | 2022.11.27 |
---|---|
MySQL general_log 파일 크기를 제한하는 방법 (0) | 2022.11.27 |
새 Gradle 프로젝트를 가져오지 못했습니다. 빌드 도구 리비전 *.0.0을 찾지 못했습니다. (0) | 2022.11.27 |
MySQL - 값이 배열에 있는 행을 선택하는 방법 (0) | 2022.11.27 |
mysql 파일 형식 및 대조 변경 (0) | 2022.11.27 |