رابطه یک به چند (One To Many) در لاراول

رابطه یک به چند (One To Many) در لاراول

 

وقتی یک موجودیت با چند موجودیت دیگه در ارتباط باشه از این ارتباط استفاده می‌کنیم. مثلا برای یک پست ممکنه چند تا نظر داشته باشیم. برای این مثال، اگه بخوایم یک رابطه یک به چند بنویسیم به متد hasMany نیاز داریم. مدل Post رو باز می‌کنیم و یک متد به اسم comments با کد زیر می‌سازیم:

<?php

          namespace App;

          use Illuminate\Database\Eloquent\Model;

          class Post extends Model

          {

              public function comments()

              {

                  return $this->hasMany(‘App\Comment’);

              }

          }

پارامترهای hasMany درست مثل hasOne هست. یعنی توی کد بالا لاراول فرض میکنه که ستون به اسم post_id توی جدول comments وجود داره. اگه اسم ستون غیر از این هست، باید توی آرگومان دوم hasMany اسم ستون رو مشخص کنیم. و همچنین فرض میشه که جدول posts یک ستون داره به اسم id که مقایسه id == post_id  انجام بشه. اگه غیر از این هست باید توی آرگومان سوم این متد، ستون مشخص بشه.

خب بعد از اینکه این ارتباط نوشته شد، به شکل زیر میتونیم ازش استفاده کنیم:

$comments = App\Post::find(1)->comments;

          foreach ($comments as $comment) {

              //

          }

توی مثال بالا یک پراپرتی داینامیک به کلاس Post اضافه شد (دقت کنید، پراپرتی). اگه بخوایم یک سری محدودیت اعمال کنیم روی رابطه، مثلا نظراتی رو بگیریم که وضعیت اونها تایید شده باشه. بجای استفاده از پراپرتی، از متد comments() به شکل زیر استفاده می‌کنیم و توی ادامه‌ی اون محدودیت‌ها رو اعمال می‌کنیم:

$comments = App\Post::find(1)->comments()->where(‘status’, ‘approved’)->get();

رابطه یک به چند معکوس

 

مثل hasOne برای این رابطه هم میشه حالت معکوس در نظر گرفت. یعنی از طریق یک نظر، بتونیم به پست اون نظر برسیم. برای اینکار از همون متد belongsTo()  این بار توی مدل Comment استفاده می‌کنیم:

<?php

          namespace App;

          use Illuminate\Database\Eloquent\Model;

          class Comment extends Model

          {

              public function post()

              {

                  return $this->belongsTo(‘App\Post’, ‘post_id’);

              }

          }

          // …

          $post = Comment::find(1)->post;

 

نحوه کارایی belongsTo دقیقا همونی هست که توی قسمت رابطه یک به یک معکوس وجود داره.