📚 PHP 고급 - 2주차: ORM (Object-Relational Mapping) 활용 - 03 관계형 데이터베이스 관리 (1:1, 1:N, N:M 관계)

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
 
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 사용자는 하나의 프로필을 가집니다.
     */
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}
PHP
 
<?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
 
<?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
 
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 사용자는 여러 개의 게시물을 가집니다.
     */
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
PHP
 
<?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
 
<?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
 
<?php
// app/Models/User.php
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 사용자는 여러 역할을 가질 수 있습니다.
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}
PHP
 
<?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
 
<?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