한 모델이 다른 모델과 여러 개의 관계를 가지는 경우를 말합니다. 예를 들어, 유저(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
로 해당 역할에 속한 사용자를 조회할 수 있습니다.
다대다 관계를 설정할 때 중간 피벗 테이블의 이름과 외래 키 컬럼을 적절히 지정해야 합니다.