728x90

라라벨 doc에도 나와있지만, 이해가 잘 안가서 겁나 헤매다 쓴다.

 

알다시피 Eloquent의 강력한 기능 중 하나는 relation 일것이다.

 

1:1 또는 1:n 관계 까지는 별 문제가 없었는데, 연결된 테이블과 연결된 테이블을 가져오는것이 어려웠다.

 

이런 경우 사용되는 메서드는 hasOneThrough, hasManyThrough, belongsToThrough 등이 있는데,

 

이것을 기록하려 한다.

 

 

먼저 테이블 구조는,

 

1. 카테고리 테이블 category (Model: Category)

id INT, NN, AI, UQ
name VARCHAR
color VARCHAR
created_at DATETIME

 

2. 카테고리와 상품을 연결하는 category_items (Model: CategoryItems)

id INT, NN, AI, UQ
category INT
item INT

 

3. 상품정보 items (Model: Items)

id INT, NN, AI, UQ
name VARCHAR
thumbnail VARCHAR
description VARCHAR
price INT

 

와 같이 가정한다. 샘플이니까 대충 저렇다고 치자.

 

우리는 category에 접근해서 카테고리 정보와 카테고리에 해당하는 상품 정보까지 모두 가져오고 싶다.

 

바로 Category 모델에 관계 메서드를 생성해주면 된다.

 

public function categoryItems() {
	return $this->hasManyThrough(Items::class, CategoryItems::class, "category", "id", "id", "item");
}

딱 봐도 감이 오겠지만, 순서가 지멋대로다.

 

총 6개의 parameter가 사용됐으니 순서대로 보자면,

 

  • Items:class -> 최종적으로 데이터를 가져올 테이블의 모델
  • CategoryItems::class -> 조회할 테이블과 최종 테이블을 중개하는 중간 테이블
  • "category" -> 중간테이블에서 최종 테이블과 매치시킬 필드
  • "id" -> 최종테이블의 인덱스 필드 (필드명이 id인 경우 null로 입력해도 무방하다)
  • "id" -> Category 테이블의 인덱스 필드 (마찬가지로 null 가능)
  • "item" -> 중간테이블에서 Category 테이블과 매치시킬 필드

이제 Category::findOrFail(1) 한방이면 1번 카테고리가 조회됨과 동시에

 

categoryItems property에 해당하는 상품들까지 모두 담겨 리턴된다.

 

써놓고 보니 혼란스러울수밖에 없어 보인다.

 

관련 내용을 구글링 해 보면 1,2번 parameter만 사용된 예제가 대부분이다.

 

그럼 join에 사용되는 필드가 모두 "id" 란 이야기인데, 보통 그렇게 하나?

 

나는 그렇게 안해서 모르겠다.

 

아무튼 이렇게 정리 해 둔 내용이 누군가에게 도움이 될지 모르겠다.

 

하다못해 나한테라도 되겠지 뭐.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기