การสร้างความสัมพันธ์แบบ 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
- สร้าง 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 และช่วยให้การออกแบบโครงสร้างฐานข้อมูลและการเขียนโค้ดมีความชัดเจน