컬렉션이란
Illuminate\Support\Collection 클래스는 배열 데이터를 조작하기 위한 유창한 래퍼입니다.
PHP의 표준 배열 함수를 개별로 호출하는 대신 메서드 체인으로 직관적으로 데이터를 가공할 수 있습니다.
컬렉션은 불변(immutable) 입니다. 각 메서드는 원본 컬렉션을 변경하지 않고 새로운 컬렉션 인스턴스를 반환합니다. 원본 데이터를 유지하면서 안전하게 조작할 수 있습니다.
컬렉션 작성
collect() 헬퍼
가장 자주 사용되는 방법입니다. 배열을 전달해 컬렉션을 생성합니다.
Collection::make()
collect()와 동등합니다. 파사드 스타일로 쓰고 싶은 경우에 사용합니다.
Collection::fromJson()
JSON 문자열에서 컬렉션을 작성합니다. 외부 API의 응답을 처리하는 경우에 편리합니다.
자주 사용하는 메서드
map — 각 요소를 변환
컬렉션의 각 요소에 처리를 적용하고 변환된 새로운 컬렉션을 반환합니다.
filter / reject — 조건으로 좁히기
filter()는 조건을 만족하는 요소만 남기고, reject()는 조건을 만족하는 요소를 제외합니다.
first / last — 요소를 1건 취득
조건을 만족하는 최초 또는 마지막 요소를 반환합니다.
pluck — 특정 키의 값만 꺼내기
중첩된 배열이나 모델에서 특정 필드만 뽑아냅니다.
groupBy — 특정 키로 그룹화
sortBy / sortByDesc — 정렬
each — 각 요소에 처리를 실행
부작용이 있는 처리(로그 출력, 이메일 전송 등)에 사용합니다. 컬렉션 자체는 변경하지 않습니다.
flatMap — 맵 후에 1단계 평탄화
각 요소를 배열로 변환하고 전체를 1차원으로 평탄화합니다.
reduce — 집계
컬렉션 전체를 하나의 값으로 접어 넣습니다.
reduceInto — 객체로 집계
reduce와 동일하게 접어 넣기 처리를 수행하지만, 콜백이 반환값을 반환할 필요가 없다는 점이 다릅니다. 기존의 객체를 직접 뮤테이트할 때 편리합니다.
&)을 사용합니다.
chunk — 분할
큰 컬렉션을 지정 사이즈로 분할합니다. 배치 처리나 화면 표시에서 편리합니다.
메서드 체인
컬렉션의 진가는 메서드 체인에 있습니다. 여러 조작을 이어서 복잡한 데이터 변환을 하나의 식으로 표현할 수 있습니다.Eloquent 와의 연계
Eloquent 쿼리의 결과는 항상Illuminate\Database\Eloquent\Collection 인스턴스로 반환됩니다.
이것은 기본 Collection을 상속하고 있어 위의 메서드가 모두 사용 가능합니다.
Eloquent 고유의 컬렉션 메서드
Eloquent\Collection에는 추가의 메서드가 있습니다.
Lazy Collections
일반적인 컬렉션은 데이터 전체를 메모리에 읽어 들이지만,LazyCollection은 PHP의 제너레이터를 활용하여 데이터를 한 건씩 처리합니다.
수만 건 이상의 대량 데이터를 다루는 경우에 메모리를 절약할 수 있습니다.
LazyCollection 작성
대량 데이터의 배치 처리
cursor()는 데이터베이스에서 한 건씩 페치하기 때문에 대량의 레코드를 처리할 때 메모리를 대폭 절약할 수 있습니다. 다만 데이터베이스 접속은 처리의 완료까지 유지됩니다.take 와 skip 으로 페이징
정리
자주 사용하는 메서드 정리
자주 사용하는 메서드 정리
컬렉션 vs 배열 함수
컬렉션 vs 배열 함수
컬렉션은 배열 함수보다 훨씬 가독성이 높아집니다.
일반 컬렉션 vs LazyCollection
일반 컬렉션 vs LazyCollection
- 일반 컬렉션: 수백~수천 건 정도의 데이터. 단순하고 직관적.
- LazyCollection: 수만 건 이상의 대량 데이터. 메모리를 절약하고 싶은 경우.
cursor()와 조합하면 효과적. - Eloquent의
get()은 일반 컬렉션,cursor()는 LazyCollection을 반환합니다.