keyboard_return  چسبون مقالات آموزشی ارتباط در پایگاه داده لاراول Laravel DB relationship
  1. ارتباط در پایگاه داده لاراول Laravel DB relationship

آموزش ایجاد ارتباط در پایگاه داده لاراول

در این پست آموزشی نحوه ایجاد ارتباط در پایگاه داده لاراول را برای شما آماده کرده ایم. این ارتباط بین دو جدول با نام cards و notes بوده که از نوع یک به چند (one to many) می باشد. یعنی هر card می تواند چند note داشته باشد (hasMany) و هر note فقط مربوط به یک card می باشد (belongsTo).

laravel relationship

در صورتیکه قسمت قبلی ارتباط با دیتابیس در لاراول را مشاهده نکردید حتما آن را مطالعه کنید.

ابتدا مایگریشن های زیر ایجاد میکنیم

php artisan make:migration create_cards_table –-create=cards 
php artisan make:migration create_notes_table –-create=notes

مایگریشن create_cards_table را از مسیر database/migrations پیدا کرده و فیلد title را در آن بسازید

$table->string('title');

سپس مایگریشن create_notes_table را از مسیر database/migrations پیدا کنید و ستون های زیر را به جدول notes اضافه کنید

$table->integer('card_id')->unsigned()->index(); 
$table->text('body');

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

در این مثال ما از ایندکس به جای کلید خارجی استفاده میکنیم.

فیلد card_id در جدول notes مقدار id از جدول cards را در خود نگه می دارد و مشخص میکند که یک note مربوط به کدام card می باشد

جهت ایجاد ستون های اضافه شده به جدول notes و cards باید migrate کنید

php artisan migrate

این دستور فیلدهای اضافه شده در جدول های cards و notes را ذخیره می کند. به منظور ایجاد ارتباط بین دو جدول cards و notes از مدل استفاده می کنیم.

حالا نوبت به ساخت یک مدل می رسد. مدل ها در قسمت آموزش بانک اطلاعاتی در لاراول توضیح داده شد.

php artisan make:model Card 
php artisan make:model Note

مدل Card را از مسیر App پیدا کنید و تابع زیر را در آن تعریف کنید.

public function notes(){
  return $this->hasMany(Note::class); 
}

تابع notes در واقع اسم جدول مورد نظر ما می باشد که قرار است فیلد card_id را از جدول cards بگیرد. کلمه کلیدی hasMany به معنای ارتباط چندگانه می باشد.یعنی هر card می تواند چند note داشته باشد.

مدل Note را باز کنید و تابع زیر را در آن تعریف کنید:

public function card(){ 
  return $this->belongsTo(Card::class); 
}

کلمه کلیدی belongsTo به معنای این است که هر note فقط متعلق به یک card می باشد.

می خواهیم مقداری را در جدول ذخیره کنیم حالا tinker را اجرا کنید. یک متغیر در آن تعریف کنید به شکل زیر:

note=new App\Note;
$note->body='this is 1th body';

برای اینکه مقدار card_id بصورت خودکار از جدول card گرفته شود و در جدول notes ذخیره شود به شکل زیر عمل می کنیم

$card = App\Card::first(); 
$card->notes()->save($note);

ابتدا یک متغیر note تعریف کردیم و مدل Note را به آن نسبت دادیم. جدول notes دارای ۵ فیلد می باشد. فیلد id از نوع AI می باشد که با ثبت هر رکورد بصورت خودکار مقدار دهی می شود.

خط دوم فیلد body را مقدار دهی می کند در اینجا مقدار 'this is 1th body' را وارد کردیم

فیلد بعدی card_id می باشد برای مقدار دهی این فیلد بر اساس جدول card یک متغیر به نام card تعریف و به مدل Card نسبت دادیم. در این دستور از تابع ()first استفاده شده که اولین card موجود در جدول cards را بر می گرداند

در خط آخر متغیر card که به اولین card موجود در جدول cards اشاره میکند تابع notes که در مدل Note تعریف کردیم را فراخوانی می کند (hasMany) و مقدار متغیر note را به این تابع ارسال می کند به این ترتیب لاراول فیلد id را از جدول card فراخوانی کرده و در فیلد card_id قرار می دهد.

دو فیلد دیگر مربوط به زمان ایجاد و بروز رسانی جدول می باشد که آن ها نیز به صورت خودکار مقدار دهی می شوند.

به منظور نمایش این اطلاعات در یک صفحه از یک view استفاده می کنیم

وارد کنترلر CardsController شوید و کد زیر را در آن وارد کنید

public function show($id){ 
    $card = Card::find($id); 
    return view('show', compact('card')); 
}

یک view جدید به نام show ایجاد کنید (show.blade.php) حال وارد view مورد نظر شوید و کد زیر را در آن وارد کنید

<ul> 
  @foreach($card->notes as $note)
    <li> {{ $note->body }} </li>
  @endforeach 
</ul>

همچنین کد زیر را در route.php وارد کنید

Route::get('card/{card}','CardsController@show');

حال پروژه را Run کنید و ادرس زیر را در مرورگر خود وارد کنید

localhost:8000/card/1

به پایان این آموزش رسیدیم. امیدواریم از این آموزش خوشتون اومده باشه. ما را از نظرات سازنده خود بی بهره نگذارید چسبون - آموزش برنامه نویسی و طراحی سایت

ارتباط در پایگاه داده لاراول Laravel DB relationship - 4.2 از 5 بر اساس 150 رای

امتیاز کاربران

ارتباط در پایگاه داده لاراول Laravel DB relationship
دیدگاه‌ها
morteza piri morteza piri 6 سال پیش
مثال خوبی بود تشکر

2024 © Copyright کليه حقوق مادی و معنوی براي چسبون محفوظ است و هرگونه کپی برداری پیگرد قانونی دارد.