بخش سوم - روابط - قسمت اول
رابطه یک به یک (One-to-One)
در رابطه یک به یک، هر رکورد از یک جدول فقط به یک رکورد از جدول دیگر مرتبط است. این نوع رابطه زمانی استفاده میشود که هر موجودیت در یک جدول دقیقاً با یک موجودیت در جدول دیگر مرتبط باشد.
به عنوان مثال:
- هر کاربر دارای یک پروفایل منحصر به فرد است.
- هر مشتری ممکن است فقط یک آدرس داشته باشد.
- هر کارمند ممکن است فقط یک کارت شناسایی داشته باشد.
1- ساختار جداول:
برای پیادهسازی این نوع رابطه در پایگاه داده، شما به دو جدول نیاز دارید. یک جدول اصلی و یک جدول وابسته که از یک کلید خارجی (foreign key) برای برقراری ارتباط استفاده میکند.
مثال:
جدول users اطلاعات کاربران را نگهداری میکند و دارای یک فیلد id به صورت primary key در کنار سایر فیلد ها.
جدول profiles پروفایل کاربران را نگهداری میکند و دارای یک کلید خارجی به نام user_id است که به فیلد id جدول users مرتبط است.
2- ایجاد مدلها:
هر جدول در پایگاه داده با یک مدل Eloquent در لاراول نمایش داده میشود.
برای تعریف رابطه یک به یک (One-to-One) در لاراول، از متدهای hasOne و belongsTo استفاده میشود.
1- متد hasOne
برای تعریف رابطه "یک به یک" استفاده میشود، جایی که یک مدل صاحب (owning) یک رکورد از مدل دیگر است.
// User Model
public function profile()
{
return $this->hasOne(Profile::class);
}
این کد به این معناست که هر User دارای یک Profile است.
پارامترها:
1- مدل مربوطه - الزامی
این پارامتر تعیین میکند که مدل مربوطه چیست. در اینجا مدل Profile مرتبط با User است.
2- کلید خارجی - اختیاری
نام ستونی که به عنوان کلید خارجی در جدول Profile ذخیره شده است. اگر این پارامتر تعیین نشود، لاراول بهطور پیشفرض نام مدل والد را با پسوند _id در نظر میگیرد. برای مثال، بهطور پیشفرض کلید خارجی در جدول profiles به صورت user_id در نظر گرفته میشود.
3- کلید محلی - اختیاری
ستونی که در مدل والد به عنوان کلید محلی برای رابطه استفاده میشود. بهطور پیشفرض، این کلید، id است. اگر کلید محلی شما ستون دیگری است، میتوانید آن را مشخص کنید.
———
2- متد belongsTo
برای تعریف رابطهای استفاده میشود که در آن یک مدل متعلق به مدل دیگری است. این متد معمولاً در سمت جدول فرزند (مثلاً Profile) برای اشاره به مدل والد (مثلاً User) استفاده میشود.
// Profile Model
public function user()
{
return $this->belongsTo(User::class);
}
این کد به این معناست که هر پروفایل متعلق به یک کاربر است.
پارامترها:
1- مدل مربوطه - الزامی
این پارامتر مدل والد را مشخص میکند. در اینجا مدل User با مدل Profile مرتبط است.
2- کلید خارجی - اختیاری
نام ستونی که به عنوان کلید خارجی در جدول فعلی (در این مثال profiles) استفاده میشود. اگر این پارامتر تعیین نشود، لاراول بهطور پیشفرض نام مدل والد را با پسوند _id در نظر میگیرد، به عنوان مثال user_id.
3- کلید والد - اختیاری
ستونی که در مدل والد به عنوان کلید منحصر به فرد استفاده میشود. بهطور پیشفرض، این کلید id است. اگر کلید والد شما ستونی غیر از id است، میتوانید آن را تعیین کنید.
———
3- پیادهسازی رابطه:
پس از تعریف رابطه در مدلها، شما میتوانید به راحتی به دادههای مرتبط دسترسی داشته باشید.
$user = User::find(1);
$profile = $user->profile;
// OR
$profile = Profile::find(1);
$user = $profile->user;
پراپرتی های فراخوانی شده دقیقا هم نام با متد هایی است که در مدل تعریف کرده ایم.
4- درج دادهها در جداول مرتبط:
$user = User::find(1);
$profile = new Profile([
'bio' => 'Full-Stack Developer'
]);
$user->profile()->save($profile);
ابتدا کاربر با شناسه 1 را پیدا میکنیم. سپس یک پروفایل جدید برای آن کاربر ایجاد میکنیم. در نهایت از متد save() استفاده میکنیم تا پروفایل به طور خودکار با کلید خارجی (user_id) به کاربر مرتبط شود.
5- بهروزرسانی دادهها:
$user = User::find(1);
$user->profile->bio = 'Updated Bio';
$user->profile->save();
فیلد bio در پروفایل کاربر را تغییر میدهیم. در نهایت تغییرات را با save() ذخیره میکنیم.
به طور کلی با فراخوانی رابطه از طریق پراپرتی یا متد مربوطه، به رکورد آن دسترسی دارید و می توانید تغییرات مورد نظر را نسبت به رکورد والد انجام دهید.
به عنوان مثال نغییر پروفایل مربوط به کاربر مالک پروفایل.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.