عملیات CRUD با استفاده از Datatable و Ajax در لاراول 5.8
عملیات CRUD با استفاده از Datatable و Ajax در لاراول 5.8
1398-03-04
ساخت dependency برای کتابخانه اندروید در گیت هاب با jitpack
ساخت dependency برای کتابخانه اندروید در گیت هاب با jitpack
1398-03-15
معرفی رابطه یک به یک (One To One) در لاراول

معرفی رابطه یک به یک (One To One) در لاراول

آموزش رابطه یک به یک در لاراول ، در این پست از تجاری اپ قصد داریم به معرفی رابطه One To One در لاراول بپردازیم و در قالب یک مثال به شما رابطه One To One در لاراول را آموزش دهیم.با ما همراه باشید.

یکی از عناصر اصلی فریمورک لاراول ، ORM Eloquent است که نگاشت رابطه به شی (Object-Relational Mapping) می باشد. Eloquent لاراول یک روش بسیار کاربرپسند برای ایجاد رابطه بین مدل های Eloquent فراهم می کند.

معرفی رابطه یک به یک در لاراول

در این پست در قالب یک مثال خواهیم دید که چگونه می توان یک رابطه یک به یک در لاراول ایجاد کرد.

رابطه یک به یک (One To One) چیست؟

رابطه یک به یک ، یک ردیف از یک جدول در پایگاه داده را به یک ردیف از جدول دیگری در پایگاه داده متصل می کند.رابطه One to One یک رابطه اساسی یا اصلی است و ما به راحتی می توانیم از آن استفاده کنیم.

در مثالی که برای آموزش این پست در نظر گرفته ایم ما یک مدل User داریم که به منظور احراز هویت (authentication) استفاده می شود.حالا ما می خواهیم یک بخش مدیریت پروفایل برای ذخیره  لینک های شبکه اجتماعی کاربر ، بیوگرافی (bio) کاربر ، تاریخ تولد کاربر (date of birth = dob) و سایر اطلاعات مرتبط با کاربر به آن اضافه کنیم.ما می توانیم ستون های مربوط به پروفایل را به جدول users اضافه کنیم اما این کار جدول users را شلوغ می کند.

بنابراین برای تمیز نگه داشتن پایگاه داده ، ما می خواهیم داده های مربوط به احراز هویت کاربر مانند آدرس ایمیل ، نام کاربری و کلمه عبور را در جدول users ذخیره کنیم و داده های مربوط به مشخصات مانند لینک های شبکه اجتماعی ، بیوگرافی ، تاریخ تولد و غیره را در جدول profiles ذخیره کنیم.

همانطور که می دانید یک کاربر می تواند یک پروفایل داشته باشد و یک پروفایل فقط متعلق به یک کاربر می باشد.بنابراین ما در اینجا یک رابطه یک به یک ایجاد می کنیم.دیاگرام مربوط به این رابطه را در زیر مشاهده می کنید:

دیاگرام رابطه یک به یک
دیاگرام رابطه یک به یک

ایجاد مدل و Migration

برای پیاده سازی رابطه یک به یک در لاراول ما به دو مدل نیاز داریم: User و Profile

توجه:
ما با این فرض آموزش را ادامه می دهیم که شما لاراول جدیدی را نصب کرده اید و تنظیمات مربوط به پایگاه داده در فایل .env را نیز انجام داده اید.

برای این کار می توانید در صورت نیاز از آموزشی که ما قبلا در این رابطه در سایت قرار داده ایم استفاده کنید: آموزش نصب لاراول 5.8 به همراه تنظیمات اولیه

همانطور که می دانیم همراه با نصب لاراول یک مدل User نیز ایجاد می شود ، بنایراین ما باید یک مدل Profile ایجاد کنیم که به جدول Profile در دیتابیس نگاشت خواهد شد.
برای ایجاد مدل Profile ، ما می توانیم از دستور artisan برای ایجاد مدل و migration استفاده کنیم.دستور زیر را اجرا کنید:

php artisan make:model Profile -m

دستور بالا یک مدل جدید App\Profile به همراه یک فایل migration مانند زیر ایجاد خواهد کرد:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    //
}

و فایل migration:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProfilesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('profiles');
    }
}

ابتدا ما متد up در migration را به صورت زیر خواهیم نوشت (به روز رسانی خواهیم کرد):

public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->date('dob');
            $table->text('bio');
            $table->string('Instagram');
            $table->string('twitter');
            $table->string('github');
            $table->timestamps();

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

اکنون ما مدل Profile را مانند زیر ویرایش می کنیم:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    protected $table = 'profiles';

    protected $fillable = ['dob', 'bio', 'Instagram', 'twitter', 'github'];
}

بعد از اینکه مدل و migration را ویرایش کردید ، دستور زیر را اجرا کنید تا جداول ایجاد شوند:

php artisan migrate

تعریف رابطه یک به یک در لاراول

بعد از این که جداول را ایجاد کردید نوبت به تعریف رابطه one to one می رسد. فایل User.php را از پوشه app باز کنید و به آن یک متد جدید از نوع public با نام profile اضافه کنید:

//One To One Relationship
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }

ما معمولا متد public ی که در بالا ذکر کردیم را با همان نام مدل مرتبط ایجاد می کنیم مثلا در این مثال متدی با نام profile ایجاد کردیم.این تابع یک رابطه hasOne را بر می گرداند.

تعریف معکوس رابطه یک به یک در لاراول

ما همچنین می توانیم با افزودن یک متد user به مدل Profile یک رابطه یک به یک معکوس اضافه کنیم مانند زیر:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    protected $table = 'profiles';

    protected $fillable = ['dob', 'bio', 'Instagram', 'twitter', 'github'];

    //One To One Relationship
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

در کدهای بالا ما متد user که رابطه belongsTo را بر می گرداند را اضافه کردیم (یک پروفایل متعلق به یک کاربر است).

ایجاد رابطه یک به یک

برای ایجاد رابطه یک به یک ، ابتدا باید مانند زیر یک نمونه یا یک از آبجکت Profile ایجاد کنیم:

ابزار Tinker در لاراول:
ابزار Tinker برای مدیریت پایگاه داده متصل به پروژه لاراول به این فریمورک اضافه شده است. اگر تنظیمات پایگاه داده را در پروژه لاراول خود به درستی انجام داده باشید می‌توانید از ابزار Tinker برای افزودن ، ویرایش و حذف اطلاعات استفاده کنیم.

با دستور زیر ابزار Tinker را باز می‌کنیم:

php artisan tinker
$profile = new Profile
$profile->dob = '1989-10-03';
$profile->bio = 'یک برنامه نویس.';
$profile->twitter = 'https://twitter.com/tejariapp_com';
$profile->Instagram = 'https://www.instagram.com/progrun.page';
$profile->github = '#';

اکنون مانند زیر ما آبجکت فرزند (child) را از طریق آبجکت parent ذخیره خواهیم کرد:

$profile = new Profile
$profile->dob = '1989-10-03';
$profile->bio = 'یک برنامه نویس.';
$profile->twitter = 'https://twitter.com/tejariapp_com';
$profile->Instagram = 'https://www.instagram.com/progrun.page';
$profile->github = '#';

$user = User::find(1);
$user->profile()->save($profile);

بازیابی داده رابطه یک به یک

هنگامی که شما داده های رابطه ای را تعریف می کنید ، می توانید به پروفایل یک کاربر با فراخوانی متد profile در آبجکت user دسترسی داشته باشید.مانند زیر:

$user = User::find(1);
$userDob = $user->profile->dob;
$userBio = $user->profile->bio;

برای بازیابی پروفایل کاربر ، لاراول به دنبال یک کلید خارجی در جدول profiles با نام user_id که با Id کاربر منطبق باشد خواهد بود.

حذف یک رابطه One To One

حذف یک رابطه یک به یک مشابه ایجاد یک رابطه one to one می باشد.ما ابتدا آبجکت parent که $user هست را می گیریم و سپس متد delete را در متد profile() فراخوانی می کنیم.مانند زیر:

$user = User::find(1);
$user->profile()->delete();

در صورتی که $user را قبل از profile حذف کنیم profile در دیتابیس بدون والد یا parent خواهد شد.

یک رویکرد این است که ابتدا profile را حذف کنیم و سپس متد delete را بر روی آبجکت $user صدا بزنیم.گاهی اوقات ممکن است شما این روال دو مرحله ای را نادیده بگیرید و یک profile در دیتابیس بدون parent رها شود.

لاراول یک روش مناسب برای حذف رکوردهای child زمانی که رکوردهای parent حذف شده است ارائه کرده است.شما می توانید زمانیکه کلید خارجی تعریف می کنید در migration از متد onDelete() استفاده کنید.مانند زیر:

public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->date('dob');
            $table->text('bio');
            $table->string('Instagram');
            $table->string('twitter');
            $table->string('github');
            $table->timestamps();

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

با قرار دادن  گزینه حذف بصورت cascading، با حذف یک کاربر از پایگاه داده ، پروفایل متناظر را به طور خودکار حذف می کند.

امیدوارم این آموزش به شما کمک کرده باشد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *