라라벨 모델 연관 속성, 중첩시에만 Eager Loading하고 싶을 때

다음과 같은 조건을 구현하려고 머리를 싸맸습니다. 4번이 중요한데요. 언제나 Eager Loading(모델이 로딩될 때 언제나 해당 연관 속성을 로드하게 하는 것)을 하게 하면 불필요한 로딩 때문에 성능이 떨어졌기 때문입니다.

  1. 모델 A가 B를 연관 속성으로 갖습니다.
  2. 모델 B가 C를 연관 속성으로 갖습니다.
  3. A에서 B를 로드하면 B가 늘 C를 들고 있게 하고 싶습니다.
  4. 그러나 B만 로드할 때는 C를 Lazy Loding(B->c를 호출하면 그제서야 c를 로딩하는 방법. 비용 효율적)하고 싶습니다.

해법은 어렵지 않았습니다. 이럴 땐 A에서 B를 정의할 때 with(['c'])를 사용하면 됩니다. 예제 코드는 아래와 같습니다.

class A() extends Model {
public function b()
{
// A->b로 호출할 때 무조건 B->c가 세팅됨(Eager Loading)
return $this->belongsTo(B::class)->with(['c']);
}
}

class B() extends Model {
public function c()
{
// B::find($id) 등 B만으로 불러올 때는 C를 사용하기 전까지
// C를 로딩하지 않음(Lazy Loding)
return $this->hasMany(C::class);
}
}

A에서 B를 연관 프로퍼티를 정의할 때 with() 메서드를 사용한 것이 핵심입니다.

👇 카테고리 글 목록

대표글

댓글 남기기