74호. 모델이 커스텀 컬렉션을 반환케 하는 방법 free

2019-10-17

어제 소개해드린 Explain How to Group Records By Relative Dates에 커스텀 컬렉션을 만들어 사용하는 장면이 나옵니다. 그동안 컬렉션을 확장해서 쓸 생각은 못해봤는데, 꽤 유용할 수도 있겠더라고요.


아래는 어제 소개한 상대 날짜로 그룹핑하는 코드인데요, 여기서 부터 시작해보죠.


Route::get('/', function(){
return Video::latest()->get()->groupBy(function($video) {
if($video->created_at->isToday()) {
return 'today';
}

if($video->created_at->isCurrentWeek()) {
return 'this week';
}

if($video->created_at->isLastWeek()) {
return 'last week';
}

return 'older'
})
})

groupBy()와 콜백을 하나의 매서드로 빼내면 다른 곳에서도 재사용하기 편하겠죠.


Collection을 상속받아 VideoCollection을 만들어서 여기에 매서드로 추가합니다.


class VideoCollection extends Collection
{
public function groupByDate()
{
return $this->groupBy(function($video) {
if($video->created_at->isToday()) {
return 'today';
}

if($video->created_at->isCurrentWeek()) {
return 'this week';
}

if($video->created_at->isLastWeek()) {
return 'last week';
}

return 'older'
});
}
}

이제 모델이 Collection이 아닌 VideoCollection을 반환하도록 합니다. 오늘의 키뽀인트! 다음과 같이 Model의 newCollection() 매서드를 오버라이드해주면 커스텀 컬렉션을 반환하게 할 수 있습니다.


class Video extends Model
{
public function newCollection(array $models = [])
{
return new VideoCollection($models);
}
}

마치며


컬렉션 클래스에 기능을 추가하기 위해 상속을 사용하고, 모델이 새로 만든 컬렉션을 반환하도록 하는 방법을 알아봤습니다. 라라벨에는 기존 클래스에 기능을 추가하는 또 다른 방법으로 매크로가 있습니다. 마침 제프리 웨이가 다음 동영상에서 매크로를 소개했으니 내일은 매크로를 준비해오겠습니다~


1일 1식 라라벨 74호

2019년 10월 17일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.