ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라라벨에서 다형성 관계(Polymorphic Relationships)
    백엔드/laravel 2024. 1. 26. 15:58

     

    모델 간의 관계를 다루는 특별한 방법 중 하나입니다.

    이는 하나의 테이블을 사용하여 여러 모델과의 관계를 설정할 수 있게 해주는 기능입니다.

     

    일반적으로 Laravel에서는 특정 테이블이 특정 모델과 관련되어 있다면 그 관계를 설정할 때 각 테이블에 대한 모델을 만들고 사용합니다. 예를 들어, posts 테이블은 Post 모델과 관련이 있고, comments 테이블은 Comment 모델과 관련이 있습니다.

     

    그러나 때로는 여러 모델과의 관계를 갖는 상황이 있습니다. 이때, 기존의 방식대로라면 각 모델에 대한 별도의 테이블을 생성해야 합니다. 하지만 다형성 관계를 사용하면 하나의 테이블을 만들어 여러 모델과의 관계를 설정할 수 있습니다.

     

    예를 들어,

    comments 테이블이 다형성 관계를 사용한다면 comments 테이블은 Post 모델과도, User 모델과도 관계를 맺을 수 있습니다. 이때, 테이블에는 commentable_type과 commentable_id 같은 열(column)이 추가되어 어떤 모델과의 관계인지를 구분하고, 해당 모델의 식별자를 저장합니다.

     

    간단히 말해, 하나의 테이블을 사용하여 여러 모델과의 관계를 설정한다는 것은 여러 모델이 하나의 테이블을 공유하여 데이터를 저장하며, 각각의 모델을 식별할 수 있도록 특별한 열을 사용한다는 개념입니다. 이는 데이터베이스 구조를 효율적으로 관리하면서도 코드를 더 간결하게 만들어줍니다.

     

    예시는 comments 테이블을 사용하여 Post 모델과 User 모델 사이의 다형성 관계를 보여줍니다.

    먼저, comments 테이블의 마이그레이션 파일은 다음과 같을 것입니다:

     

    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->text('content');
        $table->unsignedBigInteger('commentable_id');
        $table->string('commentable_type');
        $table->timestamps();
    });

     

    여기서 commentable_id는 연결된 모델의 식별자를, commentable_type은 모델의 타입을 나타냅니다.

    그런 다음, Comment 모델에서는 이러한 다형성 관계를 정의합니다:

     

    class Comment extends Model
    {
        public function commentable()
        {
            return $this->morphTo();
        }
    }

     

    이렇게 하면 Comment 모델은 Post나 User와 같은 여러 모델과의 관계를 설정할 수 있게 됩니다.

    이제 Post 모델과 User 모델에서도 다형성 관계를 정의해야 합니다.

    예를 들어, Post 모델은 다음과 같이 정의할 수 있습니다:

     

    class Post extends Model
    {
        public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable');
        }
    }

     

    User 모델도 비슷하게 정의할 수 있습니다.

    이제 Comment 모델을 통해 Post나 User 모델에 접근할 수 있게 됩니다:

     

    $comment = Comment::find(1);

    // Comment 모델에 연결된 Post 가져오기
    $post = $comment->commentable;

    // Comment 모델에 연결된 User 가져오기
    $user = $comment->commentable;

    댓글

Designed by Tistory.