ความสัมพันธ์แบบหนึ่งต่อหนึ่ง (1:1) ใน Laravel คือความสัมพันธ์ที่โมเดลหนึ่งมีความสัมพันธ์กับโมเดลอีกตัวหนึ่ง เช่น ผู้ใช้คนหนึ่งมีข้อมูลโปรไฟล์หนึ่งข้อมูล
ตัวอย่าง: User และ Profile
สมมุติว่าเรามีสองตารางในฐานข้อมูล:
- users (ตารางเก็บข้อมูลผู้ใช้)
- profiles (ตารางเก็บข้อมูลโปรไฟล์ของผู้ใช้)
- สร้าง 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); // แสดงนามสกุลผู้ใช้ที่มีโปรไฟล์นี้