Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 25: การสร้างความสัมพันธ์ระหว่าง Model (One to One)

การสร้างความสัมพันธ์แบบ One to One ใน Laravel คือการเชื่อมโยงระหว่างสองตารางที่มีความสัมพันธ์แบบหนึ่งต่อหนึ่ง (One to One) โดยที่แต่ละแถวในตารางหนึ่งจะสอดคล้องกับอีกหนึ่งแถวในอีกตารางหนึ่ง ความสัมพันธ์แบบนี้มักใช้ในกรณีที่ต้องการเก็บข้อมูลเพิ่มเติมของตารางหลัก เช่น การเชื่อมต่อข้อมูล User กับ Profile

การสร้างความสัมพันธ์แบบ One to One

ใน Laravel เราสามารถสร้างความสัมพันธ์แบบ One to One ได้โดยการใช้เมธอด hasOne() และ belongsTo() ใน Model เพื่อเชื่อมโยงกัน

ตัวอย่างการสร้างความสัมพันธ์ One to One ระหว่าง Model User และ Profile

ให้เราสร้างตาราง users และ profiles โดยที่ตาราง profiles จะมีคอลัมน์ user_id เพื่อเก็บ ID ของผู้ใช้ และเชื่อมโยงข้อมูลกับตาราง users

  1. สร้าง Model และ Migration สำหรับ User และ Profile
php artisan make:model User -m
php artisan make:model Profile -m

2.กำหนดโครงสร้างตารางในไฟล์ Migration

ในไฟล์ create_users_table.php:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamps();
});

ในไฟล์ create_profiles_table.php:

Schema::create('profiles', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('user_id')->unique();
    $table->text('bio')->nullable();
    $table->string('phone')->nullable();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

ในตัวอย่างนี้ profiles มีคอลัมน์ user_id เป็นคีย์นอกที่อ้างอิงถึง id ของตาราง users

3. กำหนดความสัมพันธ์ใน Model

ใน Model User ให้เพิ่มฟังก์ชัน profile() ที่ใช้เมธอด hasOne() เพื่อเชื่อมโยงกับ Profile

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

ใน Model Profile ให้เพิ่มฟังก์ชัน user() ที่ใช้เมธอด belongsTo() เพื่อเชื่อมโยงกลับไปที่ User

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}


การใช้งานความสัมพันธ์แบบ One to One

หลังจากสร้างความสัมพันธ์แล้ว เราสามารถเรียกใช้ข้อมูลจากความสัมพันธ์นี้ได้โดยตรง เช่น

use App\Models\User;

// ดึงข้อมูลโปรไฟล์ของผู้ใช้ที่มี ID เท่ากับ 1
$user = User::find(1);
$profile = $user->profile; // ดึงข้อมูล Profile ของ User นี้

// ดึงข้อมูลผู้ใช้จากโปรไฟล์
$profile = Profile::find(1);
$user = $profile->user; // ดึงข้อมูล User ที่เป็นเจ้าของ Profile นี้

การบันทึกข้อมูลในความสัมพันธ์แบบ One to One

สามารถใช้เมธอด save() หรือ create() เพื่อบันทึกข้อมูลของตารางที่มีความสัมพันธ์แบบ One to One ได้

// สร้างโปรไฟล์ใหม่ให้กับผู้ใช้ที่มี ID เท่ากับ 1
$user = User::find(1);
$user->profile()->create([
    'bio' => 'This is a bio',
    'phone' => '123-456-7890'
]);

// หรือการอัปเดตข้อมูล
$profile = $user->profile;
$profile->phone = '090-053-7553';
$profile->save();

การนำไปใช้งาน

การสร้างความสัมพันธ์ One to One ระหว่าง Model ทำให้การดึงข้อมูลที่เชื่อมโยงกันเป็นไปได้อย่างง่ายดายและเป็นระบบ ทำให้การจัดการข้อมูลที่มีความสัมพันธ์แบบหนึ่งต่อหนึ่งสะดวกและง่ายขึ้นใน Laravel และช่วยให้การออกแบบโครงสร้างฐานข้อมูลและการเขียนโค้ดมีความชัดเจน