122호. 소소한 엘로퀀트 꿀팁 6가지 free

2020-04-07

안녕하세요! 


어제는 정신을 어디다 뒀는지 121호를 120호라고 보냈네요 ㅠ 


스테판 바우어가 6 Laravel Eloquent Secrets to improve your code라는 글을 통해 6가지 덜 알려진 유용한 엘로퀀트 기능을 소개했습니다. 이를 요약해서 공유합니다.


snakeAttributes 속성


엘로퀀트 모델을 배열로 바꿀 때 관계가 스네이크 표기법으로 만들어지는게 기본 설정입니다.



namespace App;

use Illuminate\Database\Eloquent\Model;

class A extends Model
{
public function anotherModel()
{
return $this->hasMany(AnotherModel::class);
}
}

예를 들어 위와 같은 관계를 갖고 있을 때 AnotherModel을 로드한 A를 배열로 출력하면 another_model로 접근할 수 있습니다.



$a = A::with(‘anotherModel’)->first();
var_dump($a->toArray());
// 출력
[
"id" => 1,
"created_at" => "2020-04-05 12:27:49",
"updated_at" => "2020-04-05 12:27:49",
"another_model" => [
[
"id" => 1,
"a_id" => 1,
"created_at" => "2020-04-08 03:42:37",
"updated_at" => "2020-04-08 03:42:37",
],
],
]

$snakeAttributes 속성을 false로 바꾸면 카멜 표기법으로 바뀝니다.



namespace App;

use Illuminate\Database\Eloquent\Model;

class A extends Model
{
public static $snakeAttributes = false;

public function anotherModel()
{
return $this->hasMany(CamelCase::class);
}
}

// 다른 파일에서
$a = A::with(‘anotherModel’)->first();
var_dump($a->toArray());
// 출력
[
"id" => 1,
"created_at" => "2020-04-05 12:27:49",
"updated_at" => "2020-04-05 12:27:49",
"anotherModel" => [
[
"id" => 1,
"a_id" => 1,
"created_at" => "2020-04-08 03:42:37",
"updated_at" => "2020-04-08 03:42:37",
],
],
]

$snakeAttributes라는 속성명만 봤을 때는 카멜 표기법으로 되어 있는 속성을 스네이크 표기법으로 접근할 수 있게 해주는 것으로 오해하기 쉽습니다. 배열로 출력시 관계를 어떻게 표기할 건지에 대한 것이므로 용법에 주의하셔야 합니다.


perPage 속성


페이지네이션할 때 페이지당 가져올 아이템 갯수 기본값은 15입니다. $perPage 속성을 변경하면 이 기본값을 바꿀 수 있습니다.


appends 속성


Accessor를 이용하면 마치 속성을 미리 정의해 둔 것 처럼 사용할 수 있습니다.



function getFullNameAttribute() {
return sprintf('%s %s', $this->first_name, $this->last_name);
}

// 모델에 위와 같이 Accessor를 설정하면 아래와 같이 사용 가능
$User->fullName

하지만 API 응답을 반환할 때 처럼 객체나 컬렉션을 반환하는 경우, 또는 배열로 출력할 때는 ‘fullName’이 포함되지 않습니다. Accessor도 함께 포함되도록 하고 싶으면 $appends 속성에 추가해주면 됩니다.



protected $appends = ['full_name'];

존재하지 않는 컬럼 뮤테이터


존재하지 않는 컬럼을 속성 값 설정에 활용할 수 있습니다. 예제를 보시면 이해가 빠르실 겁니다.


duration_in_seconds 라는 컬럼을 가진 모델이 있다고 가정해봅시다. 다음과 같이 존재하지 않는 duration_in_minutes와 duration_in_hours 컬럼용 뮤테이터를 duration_in_seconds 속성값을 설정하는데 사용할 수 있습니다.



class Video extends Model
{
public function setDurationInMinutes($value)
{
$this->attributes['duration_in_seconds'] = $value * 60;
}

public function setDurationInHours($value)
{
$this->attributes['duration_in_seconds'] = $value * 60 * 60;
}
}

class AnyController
{
public function store()
{
$video->update([
'title' => request('title'),
'duration_in_minutes' => request('duration_in_minutes'),
]);
}
}

$with 속성을 이용한 이거 로딩


특정 관계를 항상 로드해야하는 경우 $with 속성에 정의해주면 편리합니다.


modelKeys() 메서드


컬렉션의 pluck() 메서드를 이용해서 id 값 배열을 얻는 경우가 많습니다.



$someCollection->pluck(‘id’);

modelKeys()를 사용해서 같은 결과를 얻을 수도 있습니다.



$someCollection->modelKeys()

마치며


이미 아는 것도 있었지만 모르고 있던 내용이 더 많았습니다. 숨겨진 기능 까지 찾아 쓰는 사람들 보면 참 대단한거 같아요! 소소하지만 알아두면 언젠가 유용하게 써먹을 날이 오겠지요? :)


1일 1식 라라벨 122호


2020년 4월 7일


이현석

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