라라벨 엘로퀀트 ORM 에서 관계와 간단한 예

엘로퀀트 ORM 기초

원글 : 엘로퀀트 ORM 기초

엘로퀀트 ORM 에서 모델 및 관계를 정이할 때 이해하기 쉽(-아마도 난해하리라 생각합니다-)게 누가 말을 안해주니까 답답했는데 제 처지에 있으셨던 분들이 좀 보고 좀 더 수월하게 접근하셨으면 좋겠어요.

엘로퀀트의 기본개념

앨로퀀트 기본은 한 행을 객체로보는 것이다.
출처 : Laravel Starter(Shawn McCool, 2012)

Users 라는 테이블에... 한 행은. User 라고 할 수 있다. 즉 ... 학생들 테이블에 1행은 한 명에 학생을 의미한다.

또한 이 학생의 속성은 이름, 키, 나이 등등... 우리는 그렇게 테이블-행-필드의 관계를 볼 수 있다. 엘로퀀트도 그렇게 본다. 그래서 테이블명은 복수형으로 쓰고 실제 모델을 정의할 때는 단수형으로 쓴다. 엘로퀀트 ORM은 한 행을 하나의 객체로 보기 때문에 기본적으로 id 라는 고유식별 필드가 있다고 가정한다.

일 : 일 관계

1:1 관계는 참조키 있는 곳이 has<em>one, 외래키가 있는 곳이 belongs</em>to 이다.
출처 : Laravel Starter(Shawn McCool, 2012)

참조대상인 원본키와 비교대상인 외래키는 .... 항상 외래키가 원본키에 속하고(belongsto) 원본키는 외래키를 가지는 (hasmany) 관계라고 보면 된다.

이 참조할키가되는 필드는 자동으로 원본모델의 id 필드가 되고 , 다른 테이블에서 외래키 필드는 원본모델_id 필드가 된다.

예를들어 User 라는 모델이 있고, Passport 라는 모델이 있는데 passport 에서 User(원본) 을 참조한다고 하면...

원본키는 user 모델에 id 필드이고 왜래키는 passport 모델에 user_id 필드가 된다.

일대일 관계에서... 두 테이블은 원본 참조키와 비교대상인 외래키를 가진다. 위에서 users 테이블은 참조키인 id필드를 가지고 passports 테이블은 userid 라는 왜래키를 가지고 있다. 이럴 때 원본 참조키 필드인 id를 가진 테이블이 왜래키인 userid가 있는 테이블을 가진것이며 반대로 외래키 user_id가 있는 테이블은 원본 참조키 필드인 id에 속한다고 표현한다.

엘로퀀트는 위에서 언급했듯이 한 줄을 하나의 객체로 각 필드를 속성으로 본다. 그러니 모델의 정의도 단수형으로 정해지고 관계도 단수.. 즉 한 줄 단위로 생각하면 된다.

    class 사용자 extends Eloquent
    {
    public function passport()
    {
    return $this->has_one('여권');
    }
    }

사용자들 테이블에 사용자 모델의 id 필드는 여권들 테이블에 여권 모델의 userid 필드를 하나 가지고(hasone) 있다.

    class 여권 extends Eloquent
    {
    public function users()
    {
    return $this->belongs_to('사용자');
    }
    }

여권들 테이블에 여권 모델의 userid 필드는 사용자들 테이블에 사용자 모델의 id 필드에 속해(belongsto) 있다.

일 : 다 관계

일대 다 관계는 원본 참조키 테이블 하나가 복사본인 외래키 여러개를 가지며 반대로는 외래키가 원본키에 속한다.

일대 다 관계는 일대일 관계와 비슷하다. 원본인 참조키는 복사본인 외래키를 여러개 가지며(hasmany) 이 여러개의 외래키들은 모두 하나의 원본 참조키에 속한다(belongsto).

테이블 : 팀들

    class 팀 extends Eloquent
    {
    public function players()
    {
    return $this->has_many('선수');
    }
    }

팀은 여러명의 선수를 가진다(has_many).

테이블 : 선수들

    class 선수 extends Eloquent
    {
    public function team()
    {
    return $this->belongs_to('팀');
    }
    }

선수들은 하나의 팀에 속한다(belongs_to).

실제 뷰 파일에서 사용 예

    $team = 팀::find(2); // id 가 2인 팀을 찾아서 배열형태로 $team 변수에 집어넣는다.

    if(is_null($team))
    {
    echo "팀을 찾을 수 없습니다.";
    }
    if(!$team->players) // $팀변수 안에 ->선수들이라는 변수값이 있지 않다면(팀에 소속된 선수들이 없다면) 코드 실행
    {
    echo "팀에 선수가 없습니다.";
    }
    foreach($team->players as $player)
    {
    echo "$player->name 선수가 $team->name 팀에 있습니다. ";
    }

다 : 다 관계

다대다 관계에서는 서로 상대방의 여러값을 가지며 그리고 속하는 관계다 (has<em>many</em>and<em>belongs</em>to)

다대다 관계는 테이블이 위 그림에서 보듯이 원본이 되는 참조키를 가진 테이블 외에 외래키만을 모아놓은 중계 테이블이 필요하다.

이 테이블에 이름은 양 테이블의 스네이크네임이다. 위에 경우는 선수들 테이블과 코스들 테이블이므로 중계 테이블이름은 '선수들_코스들' 이 된다.

엘로퀀트 ORM 에서는 신기하게도 중계테이블에 대한 모델은 정의하지 않아도 된다. 중계테이블에 이름만 스네이크네임으로 써주고, 왜래키 이름규칙을 잘 지켜주면 알아서 처리해주기 때문이다. 따라서 위 그림에서는 모델을 단 두개만 정의하면 된다.

또한 다: 다 관계는 서로 상대방의 여러 값을 가지고 동시에 상대방에 값에 속하므로 양쪽 다 'hasmanyandbelongsto' 관계로 정의한다.

테이블 : students

    class Student extends Eloquent
    {
    public function courses()
    {
    return $this->has_many_and_belongs_to('Course');
    }
    }

말하지 않아도 hasmanyandbelongsto 관계로 정의됨.

테이블 : courses

    class Course extends Eloquent
    {
    public function students()
    {
    return $this->has_many_and_belongs_to('Student');
    }
    }

말하지 않아도 hasmanyandbelongsto 관계로 정의됨.

실제 뷰 파일에서 출력 예시

    $student = Student::find(1); // 학생모델에서 id 가 1인 사람을 찾아 $student 변수에 집어넣는다.
    if(is_null($student)) //$student 에 
    {
    echo "학생을 찾을 수 없습니다.";
    exit;
    }
    if(!$student->courses)
    {
    echo "$student->name 학생이 어떤 코스에도 등록되어있지 않습니다.";
    exit;
    }
    foreach($student->courses as $course)
    {
    echo "$student->name 학생이 $course->name 에 등록되어있습니다.";
    }

    $course = Course::find(1);
    if(is_null($course))
    {
    echo "코스를 찾을 수 없습니다.";
    exit;
    }
    if(!$course->students)
    {
    echo "코스 $course->name 에 아무 학생도 없습니다."
    enrolled.";
    exit;
    }
    foreach($course->students as $student)
    {
    echo "학생 $student->name 가 코스에 등록되어 있습니다."
    $course->name.";
    }

    $course = Course::find(13);
    if(is_null($course))
    {
    echo "코스를 찾을 수 없습니다";
    exit;
    }
    $new_student_information = array(
    'name' => 'Danielle'
    );
    $course->students()->insert($new_student_information);

.

참고문헌

Shawn McCool(2012) "Laravel Starter",Packt Publishing.

comments powered by Disqus