자기참조 관계

보통 자기참조 관계 테이블은 "부서정보" 같은 상하 관계를 나타내야 하는 경우 사용합니다.

상하 관계를 표현할 수 있는 방식은 여러가지가 있지만 제가 설명하는 방식은 테이블 내에 "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;