2025. 9. 5. 15:02ㆍ프로그램/PHP 고급
지난 시간 #모델을 생성하고 #데이터를 다루는 기본적인 방법을 배웠어. 하지만 실제 서비스에서는 여러 #테이블이 복잡하게 얽혀 있지. 이번 시간에는 #ORM의 가장 큰 장점인 #테이블 간 #관계 관리를 살펴볼 거야. #Eloquent #ORM을 사용해서 #1:1, #1:N, #N:M 관계를 정의하고 #데이터를 쉽게 다루는 방법을 알아보자.
1. 1:1 관계 (One to One)
1:1 관계는 하나의 #테이블 레코드가 다른 하나의 #테이블 레코드와 정확히 연결되는 관계를 말해. 예를 들어, User #테이블과 Profile #테이블이 있다고 가정해보자. 한 명의 사용자는 하나의 프로필만을 가질 수 있어.
1-1. 관계 정의
1:1 관계를 정의하려면 두 #모델 모두에 #메서드를 추가해야 해. User #모델에서 Profile에 접근하는 #메서드는 hasOne를, Profile #모델에서 User에 접근하는 #메서드는 belongsTo를 사용해.
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 사용자는 하나의 프로필을 가집니다.
*/
public function profile()
{
return $this->hasOne(Profile::class);
}
}
<?php
// app/Models/Profile.php
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
/**
* 프로필은 한 명의 사용자에게 속합니다.
*/
public function user()
{
return $this->belongsTo(User::class);
}
}
1-2. 관계를 통한 데이터 접근
관계가 정의되면 이제 #데이터를 #속성처럼 쉽게 가져올 수 있어.
<?php
$user = User::find(1); // id가 1인 사용자 조회
echo $user->profile->phone_number; // 사용자의 프로필 전화번호에 접근
$profile = Profile::find(1); // id가 1인 프로필 조회
echo $profile->user->name; // 프로필의 사용자 이름에 접근

2. 1:N 관계 (One to Many)
1:N 관계는 하나의 레코드가 다른 여러 개의 레코드와 연결되는 관계야. 예를 들어, 한 명의 User는 여러 개의 Post를 작성할 수 있지.
2-1. 관계 정의
1:N 관계에서 #1에 해당하는 #User #모델은 hasMany #메서드를, #N에 해당하는 #Post #모델은 belongsTo #메서드를 사용해.
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 사용자는 여러 개의 게시물을 가집니다.
*/
public function posts()
{
return $this->hasMany(Post::class);
}
}
<?php
// app/Models/Post.php
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
/**
* 게시물은 한 명의 사용자에게 속합니다.
*/
public function user()
{
return $this->belongsTo(User::class);
}
}
2-2. 관계를 통한 데이터 접근
이제 User #모델에서 모든 #게시물을 조회하거나, #게시물 #모델에서 작성자의 정보를 쉽게 가져올 수 있어.
<?php
$user = User::find(1);
foreach ($user->posts as $post) {
echo $post->title; // 사용자의 모든 게시물 제목 출력
}
$post = Post::find(5);
echo $post->user->name; // 게시물 작성자 이름 출력

3. N:M 관계 (Many to Many)

N:M 관계는 양쪽 모두 여러 개의 레코드와 연결되는 관계야. 예를 들어, 한 명의 User는 여러 개의 Role을 가질 수 있고, 하나의 Role은 여러 명의 User에게 할당될 수 있지. #N:M 관계는 보통 중간에 **피벗 #테이블(Pivot Table)**을 사용해. (예: role_user #테이블)
3-1. 관계 정의
N:M 관계는 양쪽 모두 belongsToMany #메서드를 사용해.
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 사용자는 여러 역할을 가질 수 있습니다.
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
<?php
// app/Models/Role.php
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* 역할은 여러 사용자에게 할당될 수 있습니다.
*/
public function users()
{
return $this->belongsToMany(User::class);
}
}
3-2. 관계를 통한 데이터 접근 및 조작

N:M 관계에서는 #데이터를 가져오는 것 외에 #연결(attach), #연결 해제(detach), #갱신(sync) 같은 특별한 #메서드를 사용할 수 있어.
<?php
$user = User::find(1);
// 역할 할당
$user->roles()->attach(3); // id 3번 역할 할당
// 모든 역할 조회
foreach ($user->roles as $role) {
echo $role->name; // 사용자의 모든 역할 이름 출력
}
// 특정 역할만 연결 (기존 연결은 모두 끊음)
$user->roles()->sync([1, 2]); // id 1, 2번 역할만 연결
빠른속도, 간편한사용, 장애없는VPN, 사용이력없는 깨끗한 아이피
https://xn--299ao67b9qbmsf04c.net/
VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN
국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이
vpn.luzensoft.com
'프로그램 > PHP 고급' 카테고리의 다른 글
| 📚 PHP 고급 - 3주차: 인증 및 권한 관리 (프레임워크) - 02 미들웨어(Middleware)를 이용한 접근 제어 (0) | 2025.09.14 |
|---|---|
| 📚 PHP 고급 - 3주차: 인증 및 권한 관리 (프레임워크) - 01 프레임워크의 내장 인증 시스템 활용 (0) | 2025.09.13 |
| 📚 PHP 고급 - 2주차: ORM (Object-Relational Mapping) 활용 - 02 모델 생성 및 데이터베이스 연동 (0) | 2025.09.03 |
| 📚 PHP 고급 - 1주차: PHP 프레임워크 입문 - 03 라우팅, 컨트롤러, 뷰 기본 사용법 (0) | 2025.08.26 |
| 📚 PHP 중급 - 1주차: PHP 프레임워크 입문 - 02 선택한 프레임워크의 설치 및 기본 구조 이해 (0) | 2025.08.25 |