Laravel에서 Eloquent ORM을 다룰 때 Resultset에 커스텀 필드를 추가해야 할 경우가 있다.
대표적으로 순번 필드가 있는데, 고유번호(id) 필드와는 별도로 item마다 순번을 부여하여 취급하고자 하는 경우이다.
간단한 필드의 경우 Mutators를 이용할 수 있지만, 순번과 같이 아이템의 개수와 페이지에 따라 동적으로 값이 부여되어야 할 경우 Controller에서 생성해주어야 한다.
다음은 User 모델의 항목들을 10개 단위로 Pagination 하는 예제이다.
public function index()
{
$users = User::paginate(10);
$response = [
'pagination' => [
'total' => $users->total(),
'per_page' => $users->perPage(),
'current_page' => $users->currentPage(),
'last_page' => $users->lastPage(),
'from' => $users->firstItem(),
'to' => $users->lastItem()
],
'data' => $users
];
return response()->json($response);
}
여기서 number라는 순번 필드를 $users에 추가하고자 하는 경우 다음과 같이 코드를 수정한다.
public function index()
{
$users = User::paginate(10);
$total = $users->total();
$per_page = $users->perPage();
$current_page = $users->currentPage();
$count = 0;
// 순번 필드를 추가하여 transform
$users->getCollection()->transform(function ($user) use ($total, $per_page, $current_page, &$count) {
$user->number = ($total - ($per_page * ($current_page - 1))) - $count;
$count++;
return $user;
});
$response = [
'pagination' => [
'total' => $total,
'per_page' => $per_page,
'current_page' => $current_page,
'last_page' => $users->lastPage(),
'from' => $users->firstItem(),
'to' => $users->lastItem()
],
'data' => $users
];
return response()->json($response);
}
이렇게 하면 고유번호와는 별개로 순번 필드인 number가 각 item마다 추가된다. 페이지를 이동하여도 각 페이지에 맞게 순번이 올바르게 부여되는 것을 확인할 수 있다.
view에서 출력할 때 해당 필드를 적절히 이용하면 된다.
Recent Comments