Page tree

라라벨 컬렉션은 다양한 메소드를 제공하므로 용도에 맞게 선택해서 사용하면 됩니다.

 

주의할 점은 파라미터로 주어진 컬렉션의 요소를 직접 변경하는 메소드가 있고 새로운 컬렉션을 만들어서 리턴하는 메소드가 있으므로 구분해서 사용해야 합니다.

 

그러면 주요 메소드에 대해서 살펴보도록 하겠습니다.

독자들은 본 절의 예제를 php artisan tinker 로 REPL 을 구동한 후에 직접 입력해 보고 결과를 확인하면서 익혀 나가는 게 좋습니다.

all()

all() 메소드는 배열의 모든 요소를 리턴하는 메소드이며  아래의 예제는 컬렉션의 모든 요소를 리턴합니다.

>>> collect( [1, 2, 3])->all()

 

chunk()

chunk() 메소드는 배열을 정해진 갯수만큼 잘라서 새로운 컬렉션으로 만들어서 리턴해 주는 메소드입니다.  아래의 예제는 8개의 요소를 가진 컬렉션을 3개씩 나눠서 총 3개의 하위 컬렉션을 가진 컬렉션으로 만들게 됩니다.

>>> $col = collect([1, 2, 3, 4, 5, 6, 7, 8])
>>> $chunks = $col->chunk(3);
>>> $chunks->toArray()
=> [
       [1, 2, 3],
       [4, 5, 6],
       [7, 8]
   ]

 

chunk() 메소드는 뷰단의 그리드에서 유용하게 사용할 수 있습니다. 예로 프로젝트 목록을 가져온 후에 가져온 데이타를 그리드에 3개씩 표시할 경우 다음과 같이 코딩할 수 있습니다.

@foreach ($projects->chunk(3) as $chunk)
    <div class="row">
        @foreach ($chunk as $proj)
            <div class="col-xs-4">{{ $proj->name }}</div>
        @endforeach
    </div>
@endforeach

 

contains()

컬렉션에 해당 요소가 있는지 확인해 주는 메소드로 아이템, 키/값, 클로저를 활용하여 다양하게 사용할 수 있습니다.

다음은 컬렉션의 값에 항목이 있는지 확인하는 방법으로 첫 번째는 값이 존재하므로 true 가 나오며 두 번째는 false 가 됩니다.

>>> $col = collect(['name' => 'Desk', 'price' => 100]);
>>> $col->contains('Desk'); 
=> true
>>> $col->contains(101);
=> false

 

contains() 는 키/값 쌍을 파라미터로 받을 수 있습니다. 아래와 같은 키/값 쌍을 요소로 하는 컬렉션이 있을 경우 첫 번째는 product 란 키와 Desk 란 값이 있는 요소가 있으므로 true 가 나오며 두 번째는 없으므로 false 가 됩니다.

>>> $col = collect([
    ['product' => 'Desk', 'price' => 200],
    ['product' => 'Chair', 'price' => 100],
]);

>>> $col->contains('product', 'Desk');
>>> $col->contains('product', 'Bookcase');

 

마지막으로 클로저를 사용하여 임의의 조건으로 컬렉션을 조사할 수 있습니다. 아래와 같이 다양한 값을 가진 컬렉션이 있을 경우 요소중 float 형이 있는지 인하는 클로저 호출은 true 를 리턴하게 됩니다.

>>> $col = collect([1, 'str', null, 2.35]);

>>> $col->contains(function ($key, $value) {
    return is_float($value);
});

key 의 존재 유무를 확인할 경우 has() 메소드를 사용하면 됩니다.

 

count(), max(), min(), sum()

count() 는 이름 그대로 컬렉션의 총 아이템 수를 리턴하는 메소드로 별도의 설명이 필요없을 것입니다. 이외에 max(), min(), sum() 같은 다양한 집계 함수가 있습니다.

>>> $col = collect([2, 5, 8]);
>>> $col->count();
=> 3
>>> $col->max();
=> 8
>>> $col->min();
=> 2
>>> $col->sum();
=> 15

 

implode()

implode() 는 컬렉션의 아이템을 전달된 파라미터를 구분자로 하여 새로운 문자열로 만들어 줍니다. 다음 예제는 컬렉션에서 'fruit' 키에 해당하는 값을 꺼내서 , 를 구분자로 하여 하나의 문자열로 만들어 줍니다.

>>> $col = collect([
    ['fruit' => 'Banana', 'price' => 50],
    ['fruit' => 'Apple', 'price' => 60],
]);
 
>>> $col->implode('fruit', ',')
=> "Banana,Apple"

 

filter()

filter() 는 도입부에 설명한 reject() 와 반대 역할을 하는 메소드로 클로저를 호출한 결과가 true 인 요소만 남겨 놓는 메소드입니다.

다음은 문자열 길이가 5 이상인 요소만 남기게 되므로 banana 만 컬렉션에 남게 됩니다.

>>> $col = collect(['banana', 'apple', 'peach']);

>>> $fil = $col->filter(function ($item) {
    return strlen($item) > 5;
});

 

first()

first() 는 컬렉션에서 첫 번째 요소만 리턴하는 메소드로 데이타베이스에서 SELECT 한 결과중 첫 번째를 가져올 때 유용하게 사용할 수 있습니다. 다른 메소드와 마찬가지로 클로저를 사용할 수 있으며 다음 코드는 5 보다 큰 값중 첫 번째인 7을 리턴하게 됩니다.

>>> collect([3, 5, 7, 9])->first(function ($key, $value) {
    return $value > 5;
});

 

forget()

forget() 는 컬렉션에서 키값에 해당하는 요소를 삭제하는 메소드입니다. 다음 예제를 실행하면 item 요소가 삭제되므로 price 만 남겨됩니다.

>>> $col = collect(['item' => 'banana', 'price' => 50]);
>>> $col->forget('item');
>>> $col->all()
=> [
     "price" => 50,
   ]

forget 은 다른 메소드와는 달리 새로운 컬렉션을 리턴하지 않고 현재 컬렉션을 변경하므로 새로운 컬렉션이 필요할 경우 복제후에 forget 을 실행해야 합니다.

 

map()

map() 은 컬렉션을 순회하면서 각 요소를 클로저에 전달하여 처리된 결과를 새로운 컬렉션으로 리턴합니다. 첫 번째 파라미터는 요소의 값이며 두 번째는 키입니다. 다음은 모든 요소의 값을 소문자로 만들어서 새로운 컬렉션으로 리턴합니다.

>>> $col = collect(['BAnana', 'AppLE',]);

>>> $col2 = $col->map(function ($item, $key) {
    return strtolower($item);
});

대용량 컬렉션을 다룰 경우 map 은 적당하지 않으며 요소를 바로 변경할 수 있는 transform() 을 사용하는 게 좋습니다.

 

pull()

pull() 은 컬렉션에서 해당 키에 해당하는 요소를 삭제하고 리턴하는 메소드로 입니다. 

>>> $col = collect(['price' => 50, 'fruit' => 'Banana'])
>>> $col->pull('fruit')
=> "Banana"
 

Banana 가 삭제되었으므로 dump($col) 을 실행하면 price 만 출력됩니다.

 

push()

push() 는 현재 컬렉션의 마지막에 아이템을 추가하며 키/값 쌍이 아닌 단일 컬렉션일 경우에 사용합니다. 

>>> $col = collect(['banana', 'apple']);
>>> $col->push('orange');

 

put()

put() 는 현재 컬렉션의 마지막에 키/값 쌍의 아이템을 추가합니다. 다음 예제는 컬렉션에 키가 price 이며 값이 50 인 아이템을 추가합니다.

>>> $col = collect(['id' => 1, 'fruit' => 'banana']);
>>> $col->put('price', 50);

 

take()

take() 는 현재 컬렉션에서 파라미터로 주어진 갯수만큼의 아이템을 추출하여 새로운 컬렉션으로 만들어서 리턴합니다. take 는 데이타베이스에서 조회시에 LIMIT 키워드를 사용하여 건수 제한을 하는 것과 비슷한 용도라고 생각하면 됩니다.

다음 예제는 앞에서 3 개의 요소를 리턴하므로 $chunk 에는 1,2,3 을 요소로 갖는 컬렉션이 리턴됩니다.

>>> $col = collect([1, 2, 3, 4,5]);
>>> $chunk = $col->take(3)

 

toArray()

toArray() 는 현재 컬렉션을 PHP 의 배열로 만들어서 전달합니다. 외부 라이브러리가 PHP의 배열만 지원할 경우 상호 연동하는데 유용합니다. 다음 예제는 두 개의 키/값 쌍을 갖는 PHP 의 배열을 리턴합니다.

>>> $col = collect(['fruid' => 'Banana', 'price' => 50]);
>>> $col->toArray();
=> [
       "fruid" => "Banana",
       "price" => 50
   ]

 

toJson()

toJson() 은 컬렉션을 JSON 형식으로 변환해 주는 메소드로 REST API 서버등을 만들때 유용하게 사용할 수 있습니다. 위의 예제에서 생성한 컬렉션 객체에서 toJson() 을 호출하면 아래와 같이 JSON 문자열로 변환이 됩니다.

>>> $col = collect(['fruid' => 'Banana', 'price' => 50]);
>>> $col->toJson();
=> "{\"fruid\":\"Banana\",\"price\":50}"

 

실제로 API 서버를 만든다면 HTTP 요청 헤더에 ‘X-Requested-With: XMLHttpRequest’ 가 있는지 확인하고 이 값이 있다면 Ajax 요청이므로 HTML 이 없는 json 데이타를 전송해 주면 됩니다.

라라벨은 Ajax 요청인지 여부를 Request 객체의 ajax() 메소드로 간단하게 확인할 수 있습니다.

public function getJson(Request $request)
{
    $col = collect(['fruid' => 'Banana', 'price' => 50]);

    if ($request->ajax()) {
        return $col->toJson();
    }

    return $col->toArray();
}

 

 

 

where()

where() 은 컬렉션 안의 값을 조회할 때  키/값 쌍을 이용하여 필터링할 수 있습니다. 다음 예제는 price 가 70 인 아이템이 리턴되게 됩니다. 키/값 쌍으로 찾으므로 SQL 과는 달리 컬렉션의 where() 는 '=', '>' 같은 연산자를 사용할 수 없습니다.

>>> $col = collect([
    ['fruit' => 'Banana', 'price' => 50],
    ['fruit' => 'Peach', 'price' => 100],
    ['fruit' => 'Orange', 'price' => 70],
    ['fruit' => 'Apple', 'price' => 80],
]);

>>> $fil = $col->where('price', 70);

 

그 외에 다양하고 유용한 메소드가 제공되고 있으니 라라벨의 문서 사이트(http://laravel.com/docs/5.1/cols) 에서 용도에 맞는 메소드를 찾아서 사용하면 됩니다.

 

마치며

라라벨 컬렉션은 PHP 배열의 단점을 해결하고 일관되고 편리하게 자료를 다룰 수 있는 유용한 클래스입니다.

더불어 라라벨에 포함된 ORM(Object-relational mapping) 은 DBMS 에서 가져온 결과를 컬렉션으로 전달하므로 DBMS 의 자료도 컬렉션으로 손쉽게 다룰 수 있습니다.

 

이제 라라벨이 제공하는 ORM인 Eloquent 에 대해서 알아 봅시다.