Dev to webs {Coding…}

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

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

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

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

การสร้างความสัมพันธ์แบบ One to Many สามารถทำได้โดยใช้เมธอด hasMany() และ belongsTo() ใน Model โดยที่ Model หลักจะใช้ hasMany() และ Model ที่ถูกเชื่อมโยงจะใช้ belongsTo()

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

สมมติว่าเรามีตาราง users และ posts โดยที่ผู้ใช้ (User) แต่ละคนสามารถมีโพสต์ (Post) ได้หลายโพสต์ เราจะสร้างความสัมพันธ์นี้โดยให้ตาราง posts มีคอลัมน์ user_id ซึ่งจะเก็บค่า ID ของผู้ใช้ที่เป็นเจ้าของโพสต์นั้นๆ

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

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

ในไฟล์ create_users_table.php:

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

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

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

  • ใน Model User ให้เพิ่มฟังก์ชัน posts() ที่ใช้เมธอด hasMany() เพื่อเชื่อมโยงกับ Post
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

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

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

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

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

use App\Models\User;
use App\Models\Post;

// ดึงโพสต์ทั้งหมดของผู้ใช้ที่มี ID เท่ากับ 1
$user = User::find(1);
$posts = $user->posts; // ดึงข้อมูล Post ทั้งหมดของ User นี้

// ดึงข้อมูลผู้ใช้จากโพสต์
$post = Post::find(1);
$user = $post->user; // ดึงข้อมูล User ที่เป็นเจ้าของ Post นี้

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

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

// สร้างโพสต์ใหม่ให้กับผู้ใช้ที่มี ID เท่ากับ 1
$user = User::find(1);
$user->posts()->create([
    'title' => 'บทความใหม่',
    'content' => 'เนื้อหาของบทความนี้...'
]);

// การอัปเดตข้อมูลโพสต์
$post = $user->posts()->find(1);
$post->title = 'แก้ไขชื่อบทความ';
$post->save();

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

เราสามารถนับจำนวนรายการที่เกี่ยวข้องกับ Model ได้โดยใช้เมธอด count()

// นับจำนวนโพสต์ของผู้ใช้
$user = User::find(1);
$postCount = $user->posts()->count();

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

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