[Tip] Laravel with method specific columns

Laravel의 with method는 relation된 다른 테이블의 값을 함께 가져올 때 사용된다.

다만 이번 프로젝트에서 users 테이블의 연결된 logs의 timestamp 값 (created_at, updated_at)을 가져오고 싶었는데 hidden으로 감추기엔 모두 사용되는 값이였고,
그렇다고 모두 가져오기엔 필요없는 데이터와, 유저에게 표시되면 안되는 부분도 있어서 생성일만 가져오는게 제일인 상황에서 아래와 같이 코드를 짰었다.

// ...
public function history()
{
    // ...
    $logs = $user->logs;
    foreach ($logs as $log) {
        $user->log = [
            'created_at' => $log->created_at,
            'updated_at' => $log->updated_at,
        ];
    }
    // ...
    return $user;
}
// ...

리펙토링을 하는중에 가만 생각해보니 Raw로 쿼리를 짯을 땐 select로 원하는것만 가져오면되는데,
이걸 또 with으로 가져오다보니 select를 따로 하려면 callback을 짜야하는데 간단히 select 정도만 하면되는데 콜백으로 가독성이 더 떨어질까 생각하는 와중에 with에서 callback없이 원하는 column만 가져올 수 있는 방법을 찾앗다.

$user->with('logs:id,created_at,updated_at')->get()

with에 relation method명과 원하는 컬럼 명을 위와같은 포맷으로 전달해 주면 해당 결과만 표시되고 그외의 결과는 표시되지 않는다.

callback보다 보기 깔끔하고, 위에 코드보다 깨끗(?) 하다.

다만 주의해야 하는점이 반드시 ‘id‘값을 포함해야 한다. 예를 들어
$user->with('logs:created_at,updated_at')->get() 와 같이 작성하면 작동되지 않는다.
id 값을 기준으로 가져오기때문에 반드시 logs:id,를 넣어주어야한다.