다음과 같은 조건을 구현하려고 머리를 싸맸습니다. 4번이 중요한데요. 언제나 Eager Loading(모델이 로딩될 때 언제나 해당 연관 속성을 로드하게 하는 것)을 하게 하면 불필요한 로딩 때문에 성능이 떨어졌기 때문입니다.
- 모델 A가 B를 연관 속성으로 갖습니다.
- 모델 B가 C를 연관 속성으로 갖습니다.
- A에서 B를 로드하면 B가 늘 C를 들고 있게 하고 싶습니다.
- 그러나 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()
메서드를 사용한 것이 핵심입니다.
댓글 남기기