라라벨에서 데이터베이스 관계(Relationship)를 정의하는 방법은?
_____A1: 라라벨 데이터베이스 관계는 서로 연관된 두 개 이상의 데이터 모델 간의 연결을 의미하며, Eloquent ORM에서 모델 간 데이터를 쉽게 조회하고 조작할 수 있도록 해줍니다.
Q2: 라라벨에서 관계를 정의하는 기본 유형에는 어떤 것들이 있나요?
A2: 라라벨에서 제공하는 주요 관계 유형은 다음과 같습니다.
- 일대일 관계(One To One)
- 일대다 관계(One To Many)
- 다대다 관계(Many To Many)
- 다형성 일대다 관계(Polymorphic One To Many)
- 다형성 다대다 관계(Polymorphic Many To Many)
- Has One Through, Has Many Through 관계
Q3: 일대일(One To One) 관계를 어떻게 정의하나요?
A3: 두 모델 간 1:1 관계를 설정할 때, 보통 한 모델에 `hasOne()` 메서드, 다른 모델에 `belongsTo()` 메서드를 사용합니다.
```php
// User 모델
public function phone()
{
return $this->hasOne(Phone::class);
}
// Phone 모델
public function user()
{
return $this->belongsTo(User::class);
}
```
Q4: 일대다(One To Many) 관계를 정의하는 방법은?
A4: 한 모델이 여러 개의 다른 모델을 가질 때 `hasMany()` 메서드를 사용하며, 반대쪽에는 `belongsTo()`를 사용합니다.
```php
// Post 모델
public function comments()
{
return $this->hasMany(Comment::class);
}
// Comment 모델
public function post()
{
return $this->belongsTo(Post::class);
}
```
Q5: 다대다(Many To Many) 관계는 어떻게 정의하나요?
A5: 두 모델이 서로 다수의 관계를 가질 때 `belongsToMany()` 메서드를 양쪽 모델에 정의합니다. 중간 테이블(pivot table)이 있어야 하며, 별도의 모델 없이도 연동됩니다.
```php
// User 모델
public function roles()
{
return $this->belongsToMany(Role::class);
}
// Role 모델
public function users()
{
return $this->belongsToMany(User::class);
}
```
Q6: 다형성(Polymorphic) 관계란 무엇인가요?
A6: 다형성 관계는 여러 모델이 하나의 공통 관계를 공유할 때 사용합니다. 예를 들어, 댓글(Comment)이 글(Post)뿐만 아니라 사진(Photo)에도 달리는 경우입니다.
Q7: 다형성 일대다(Polymorphic One To Many) 관계는 어떻게 정의하나요?
A7: 댓글 모델은 하나의 다형성 관계를 갖고, 여러 모델이 댓글을 가질 수 있도록 합니다.
```php
// Comment 모델
public function commentable()
{
return $this->morphTo();
}
// Post 모델
public function comments()
return $this->morphMany(Comment::class, 'commentable');
}
// Photo 모델
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
```
Q8: 다형성 다대다(Polymorphic Many To Many) 관계 설정 방법은?
A8: 예를 들어, 태그(Tag) 모델이 게시글(Post) 및 비디오(Video) 모델에 다대다 관계로 연결될 때 쓰입니다.
```php
// Tag 모델
public function posts()
{
return $this->morphedByMany(Post::class, 'taggable');
}
public function videos()
{
return $this->morphedByMany(Video::class, 'taggable');
}
// Post 모델
public function tags()
{
return $this->morphToMany(Tag::class, 'taggable');
}
// Video 모델
public function tags()
{
return $this->morphToMany(Tag::class, 'taggable');
}
```
Q9: 관계 메서드 내에서 추가적인 조건을 넣을 수 있나요?
A9: 네, 관계 정의 시 쿼리 빌더 메서드를 체이닝하여 조건, 정렬, 제한 등을 추가할 수 있습니다.
```php
public function publishedComments()
{
return $this->hasMany(Comment::class)->where('is_published', true);
}
```
Q10: 라라벨에서 관계를 이용해 어떻게 데이터를 가져오나요?
A10: 관계 메서드를 호출하거나 `with()` 메서드를 통해 eager loading을 할 수 있습니다.
```php
// 관계 호출
$user = User::find(1);
$phone = $user->phone;
// Eager Loading
$users = User::with('phone')->get();
```
Q11: 관계 메서드는 반드시 컬렉션을 반환하나요?
A11: 관계 유형에 따라 다릅니다. `hasOne()`, `belongsTo()`는 단일 모델 인스턴스를, `hasMany()`, `belongsToMany()`는 컬렉션을 반환합니다.
Q12: 관계 외래키와 로컬키를 따로 지정하려면 어떻게 하나요?
A12: 관계 메서드 내 옵션 파라미터로 지정할 수 있습니다.
```php
// hasOne 예시
return $this->hasOne(Profile::class, 'user_id', 'id');
```
Q13: 관계를 반대로 지정하려면 어떻게 합니까?
A13: `hasOne()`, `hasMany()`는 "부모 모델이 관계를 가진다"는 의미이고, `belongsTo()`는 "자식 모델이 부모를 참조"함을 뜻합니다. 상황에 맞게 사용하세요.
---
라라벨에서 데이터베이스 관계는 Eloquent ORM의 핵심 기능으로, 위 관계 유형을 이해하고 모델에 적절히 정의하면 풍부한 데이터 연동 기능을 구현할 수 있습니다.
작성자:
ㅁㅁ [비회원]
| 작성일자: 1년 전
2024-08-26 08:17:06
조회수: 200 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 200 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.