라라벨 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" 란 이야기인데, 보통 그렇게 하나?
나는 그렇게 안해서 모르겠다.
아무튼 이렇게 정리 해 둔 내용이 누군가에게 도움이 될지 모르겠다.
하다못해 나한테라도 되겠지 뭐.
'내가 자꾸 까먹어서 쓰는 개발 이야기 > Laravel' 카테고리의 다른 글
Laravel 11 - Kernel.php 제거 (0) | 2024.04.22 |
---|---|
Laravel, Vue 설치 및 Vue SPA 세팅 script (0) | 2020.08.13 |
php artisan make:model 실행 시 경로 지정하기 (0) | 2020.05.26 |
Blade template 사용자 directive (0) | 2019.06.24 |
사용자 Facade 만들어 phpstorm 에서 자동완성까지 (0) | 2019.06.11 |
최근댓글