131호. 코드 양을 줄여주는 다양한 엘로퀀트 Or 메서드 free

2020-04-23

삼항 연산자를 쓰면 같은 코드 양이 줄어들고, Null 병합 연산자를 쓰면 더 줄어드는 건 다들 아실 겁니다.


if (isset($_POST['name'])) {
$name = $_POST['name'];
} else {
$name = 'nobody';
}

위의 코드를 삼항 연산자로 표현하면 아래와 같이 코드 양이 줄고


$name = isset($_POST['name']) ? $_POST['name'] : 'nobody'; 

Null 병합 연산자를 쓰면 더 줄어들죠.


$name = $_POST['name'] ?? 'nobody';

마찬가지로 코드 양을 줄여주는 엘로퀀트 모델 메서드가 있습니다. 오늘은 제이슨 벡스가 라라벨 뉴스에 기고한 Laravel firstOrNew, firstOrCreate, firstOr, and updateOrCreate methods 를 간단히 정리해서 소개해 드리고자 합니다.


firstOrNew()


firstOrNew()는 조건에 맞는 데이터가 있으면 첫번째 결과를 가져오고 그렇지 않으면 새 인스턴스를 생성합니다.


$user = User::firstOrNew(
['email' => request('email')], // 찾을 조건
['name' => request('name')] // 위의 조건에 더해 인스턴스를 만들 때 추가할 데이터
);

$user->save();

위 코드는 아래 코드와 같은 동작을 합니다.


$user = User::where('email', request('email'))->first();

if ($user === null) {
$user = new User(['email' => request('email')]);
}

$user->name = request('name');

$user->save()

firstOrCreate()


firstOrCreate()은 새 인스턴스를 만드는데 그치지 않고 데이터베이스에 저장까지 합니다.


$user = User::firstOrCreate(
['email' => request('email')],
['name' => request('name')]
);

// $user->save() 가 필요하지 않음

firstOr()


데이터베이스에 찾는 결과가 없으면 클로저를 실행합니다. 단순히 모델 객체를 만들거나 저장하는 데서 벗어나 자유롭게 활용할 수 있을 것 같습니다. 저도 처음 알았는데 요거 좋네요!


$user = User::where('email', request('email'))->firstOr(function () {
$account = Account::create([ //... ]);

return User::create([
'account_id' => $account->id,
'email' => request('email'),
]);
});

updateOrCreate()


찾아서 있으면 업데이트하고 없으면 생성하는 메서드입니다. 업서트라고 표현하기도 하죠.


$user = User::updateOrCreate(
['email' => request('email')], // 찾을 조건
['name' => request('name')] // 찾을 조건에 더해 추가할 데이터
);

위 코드는 아래 코드와 같은 동작을 합니다.


$user = User::where('email', request('email'))->first();

if ($user !== null) {
$user->update(['name' => request('name')]);
} else {
$user = User::create([
'email' => request('email'),
'name' => request('name'),
]);
}

마치며


라라벨 애플리케이션을 만들다 보면 위의 메서드를 활용할 상황이 정말 많이 발생합니다. 잘 활용하면 코드양을 많이 줄일 수 있을 겁니다.


1일 1식 라라벨 131호

2020년 4월 23일


이현석

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