Laravel Relation 1:多, 多:多 정리

hannni·2023년 6월 9일
0

Laravel

목록 보기
15/16

✏️ 1:多

한 모델이 다른 모델과 여러 개의 관계를 가지는 경우를 말합니다. 예를 들어, 유저(User)과 게시물(Posts) 간의 관계가 있을 수 있습니다. 하나의 게시물은 여러 개의 댓글을 가질 수 있지만, 하나의 댓글은 하나의 게시물에 속할 수 있습니다.

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

User 모델 클래스에서 관계 메소드를 정의합니다.

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Post 모델 클래스에서 역방향 관계를 정의합니다.

위의 코드에서 hasMany()는 User 모델이 Post 모델과 일대다 관계를 가진다는 것을 나타내고, belongsTo()는 Post 모델이 User 모델에 속한다는 것을 나타냅니다.

위의 코드에서 $user->posts는 특정 사용자의 게시물들을 조회하고, $post->user는 특정 게시물의 작성자를 조회합니다.

📒 외래키 명시

라라벨에서는 일대다(One-to-Many) 관계를 설정하는 다양한 방법이 있습니다.
$this->hasMany()$this->belongsTo() 메소드를 사용한 방법 외에 외래 키를 직접 명시하는 방법을 사용할 수도 있습니다

class User extends Model
{
    protected $primaryKey = 'user_id';

    public function posts()
    {
        return $this->hasMany(Post::class, 'user_id');
    }
}

hasMany 메소드의 두 번째 인자로 외래 키를 직접 명시했습니다. 이를 통해 기본적으로 예상되는 외래 키 이름이 아닌 사용자 정의된 외래 키를 사용할 수 있습니다.

✏️ 多:多

한 모델이 다른 모델과 다중 관계를 가지고 서로 연결되는 경우를 말합니다.예를 들어, 사용자(User)과 역할(Role) 간의 관계가 있을 수 있습니다. 한 명의 학생은 여러 개의 강의를 수강할 수 있으며, 한 강의는 여러 명의 학생들에게 개설될 수 있습니다. 이 경우에는 중간에 연결 테이블이 필요하며, 라라벨에서는 편리한 방법으로 다대다 관계를 다룰 수 있습니다.

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'user_role');
    }
}

위의 예시에서 belongsToMany() 메소드를 사용하여 다대다 관계를 설정했습니다. 첫 번째 인자로 관계할 모델의 클래스명을 전달하고, 두 번째 인자로 중간 피벗 테이블의 이름을 전달했습니다.

중간 피벗 테이블의 이름은 user_role로 가정했습니다. 이 피벗 테이블은 users 테이블과 roles 테이블 간의 다대다 관계를 표현하는 역할을 합니다. 이 피벗 테이블은 user_id와 role_id와 같은 두 개의 외래 키를 포함해야 합니다.

다대다 관계가 설정되면 사용자 모델에서는 $user->roles로 사용자의 역할을 조회할 수 있고, 역할 모델에서는 $role->users로 해당 역할에 속한 사용자를 조회할 수 있습니다.

다대다 관계를 설정할 때 중간 피벗 테이블의 이름과 외래 키 컬럼을 적절히 지정해야 합니다.

0개의 댓글