자기참조 관계
보통 자기참조 관계 테이블은 "부서정보" 같은 상하 관계를 나타내야 하는 경우 사용합니다.
상하 관계를 표현할 수 있는 방식은 여러가지가 있지만 제가 설명하는 방식은 테이블 내에 "parent_id" 라는 컬럼을 사용하여 부모정보의 "id"를 지정하는 방식입니다.
테이블 표
id |
name |
parent_id |
1 |
최 상위 부서 |
null |
2 |
하위 부서1 |
1 |
3 |
하위 부서2 |
1 |
4 | 최 하위 부서1 | 2 |
모델 생성하기
namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Department extends Model { /** 상위 부서 */ public function parent() { return $this->belongsTo('App\Department', 'parent_id'); } /** 하위 부서들 */ public function child() { return $this->hasMany('App\Department', 'parent_id'); } }
질의 방법
1. 나의 최상위 부서 찾기
$id = 10; // 나의 부서 번호 $department = \App\Department::find($id) $parent = []; // 최상위 부서 정보 while ($department->parent()->first() !== null) { $department = $department->parent()->first(); $parent = $department; } return $parent;
2. 나에게 속해있는 부서들 찾기
$id = 1; // 나의 부서 번호 $department = \App\Department::find($id); $departments = $department->child()->get(); $children = collect([]); // 하위 부서들 정보 while (!$departments->isEmpty()) { $xxx = collect([]); foreach ($departments as $child) { $children = $children->merge([$child]); $xxx = $xxx->merge($child->child()->get()); } $departments = $xxx; } return $children;
'PHP' 카테고리의 다른 글
[Laravel] db:seed 실행 시 Class does not exist 에러 해경방법 (0) | 2019.01.31 |
---|---|
[Laravel 5.4] http(80)요청을 https(443)로 Redirect 시키는 방법 (2) | 2017.12.12 |
[Laravel] 마이그레이션 에러(Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.) 해결 방법 (0) | 2017.12.08 |
[Laravel 5.4] 패스워드 변경 후 로그인 유지 하는 방법 (2) | 2017.07.03 |
[Laravel 5.4] 여러개의 데이터베이스에 연결하는 방법 (0) | 2017.02.19 |