Relationships ระหว่าง Models ใน Laravel แบบ One to One: ความสัมพันธ์แบบหนึ่งต่อหนึ่ง (1:1)

ความสัมพันธ์แบบหนึ่งต่อหนึ่ง (1:1) ใน Laravel คือความสัมพันธ์ที่โมเดลหนึ่งมีความสัมพันธ์กับโมเดลอีกตัวหนึ่ง เช่น ผู้ใช้คนหนึ่งมีข้อมูลโปรไฟล์หนึ่งข้อมูล

ตัวอย่าง: User และ Profile

สมมุติว่าเรามีสองตารางในฐานข้อมูล:

  • users (ตารางเก็บข้อมูลผู้ใช้)
  • profiles (ตารางเก็บข้อมูลโปรไฟล์ของผู้ใช้)
  1. สร้าง Migration และ Model สำหรับตาราง users และ profiles ภายใต้โฟลเดอร์ /database/migrations

php artisan make:migration create_users_table –create=users -m
php artisan make:migration create_profiles_table –create=profiles -m

แก้ไข create_users_table.php ภายใต้โฟลเดอร์ /database/migrations ดังนี้

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('firstname');
        $table->string('lastname');
        $table->timestamps();
    });
}

แก้ไข create_profiles_table.php ภายใต้โฟลเดอร์ /database/migrations ดังนี้

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

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

แก้ไข users.php ภายใต้โฟลเดอร์ /app/Models ดังนี้

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Models
{
    use HasFactory;

    public function profile()
    {
        return $this->hasOne(Profile::class); //ผู้ใช้มีหนึ่งโปรไฟล์ 
    }
}

แก้ไข profiles.php ภายใต้โฟลเดอร์ /app/Models ดังนี้

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'bio',
        'website',
        'birthdate',
        'phone'
    ];

    public function user()
    {
        return $this->belongsTo(User::class); //โปรไฟล์ของผู้ใช้
    }
}

เมื่อกำหนดความสัมพันธ์แล้ว เราสามารถเรียกดูข้อมูลผู้ใช้พร้อมกับข้อมูลโปรไฟล์ตามกำหนดใน Model

// ดึงข้อมูลผู้ใช้และโปรไฟล์
$user = User::find(1);
dd($user->profile->bio); // แสดงข้อมูล bio ของโปรไฟล์ผู้ใช้
dd($user->profile->website); // แสดงเว็บไซต์ของผู้ใช้
dd($user->profile->birthdate); // แสดงวันเกิดของผู้ใช้

dd($user->profile->phone); // แสดงเบอร์โทรของผู้ใช้
// ดึงข้อมูลโปรไฟล์และผู้ใช้
$profile = Profile::find(1);
dd($profile->user->firstname); // แสดงชื่อผู้ใช้ที่มีโปรไฟล์นี้
dd($profile->user->lastname); // แสดงนามสกุลผู้ใช้ที่มีโปรไฟล์นี้

ผู้เขียน

Sinnapa Prasith-Rathsint
sinnapa@g.swu.ac.th