216.73.216.172 TODAY : 3,772

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ๊ณ ๊ธ‰

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 2์ฃผ์ฐจ: ORM (Object-Relational Mapping) ํ™œ์šฉ - 03 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ (1:1, 1:N, N:M ๊ด€๊ณ„)

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 2์ฃผ์ฐจ: ORM (Object-Relational Mapping) ํ™œ์šฉ - 03 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ (1:1, 1:N, N:M ๊ด€๊ณ„)
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-09-05 15:03:25
์กฐํšŒ์ˆ˜ 4
- ์„ค๋ช…

์ง€๋‚œ ์‹œ๊ฐ„ #๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ณ  #๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด. ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์—ฌ๋Ÿฌ #ํ…Œ์ด๋ธ”์ด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ์ง€. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” #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 IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœํ•„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
     */
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

PHP

<?php
// app/Models/Profile.php
use IlluminateDatabaseEloquentModel;

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; // ํ”„๋กœํ•„์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์— ์ ‘๊ทผ


uploadImage


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 IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
     */
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

PHP

<?php
// app/Models/Post.php
use IlluminateDatabaseEloquentModel;

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; // ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ์ž ์ด๋ฆ„ ์ถœ๋ ฅ


uploadImage


3. N:M ๊ด€๊ณ„ (Many to Many)

uploadImage

N:M ๊ด€๊ณ„๋Š” ์–‘์ชฝ ๋ชจ๋‘ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ด€๊ณ„์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋ช…์˜ User๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Role์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•˜๋‚˜์˜ Role์€ ์—ฌ๋Ÿฌ ๋ช…์˜ User์—๊ฒŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์ง€. #N:M ๊ด€๊ณ„๋Š” ๋ณดํ†ต ์ค‘๊ฐ„์— **ํ”ผ๋ฒ— #ํ…Œ์ด๋ธ”(Pivot Table)**์„ ์‚ฌ์šฉํ•ด. (์˜ˆ: role_user #ํ…Œ์ด๋ธ”)


3-1. ๊ด€๊ณ„ ์ •์˜


N:M ๊ด€๊ณ„๋Š” ์–‘์ชฝ ๋ชจ๋‘ belongsToMany #๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด.

PHP

<?php
// app/Models/User.php
use IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ์—ญํ• ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

PHP

<?php
// app/Models/Role.php
use IlluminateDatabaseEloquentModel;

class Role extends Model
{
    /**
     * ์—ญํ• ์€ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
     */
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}


3-2. ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘

uploadImage


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/