ความสัมพันธ์แบบ 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 ของผู้ใช้ที่เป็นเจ้าของโพสต์นั้นๆ
- สร้าง 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 ช่วยให้การดึงข้อมูลที่เชื่อมโยงกันระหว่างสองตารางทำได้ง่ายและสะดวกมากขึ้น ทำให้เราสามารถจัดการข้อมูลที่มีความสัมพันธ์กันอย่างมีประสิทธิภาพและเขียนโค้ดที่อ่านง่ายและเข้าใจง่าย