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

مثال زیر یک رابطه ساده با استفاده از Eloquent ها است :

class Author extends Model 
{
  public function books()
  {
    return $this->hasMany(Book::class);
  }
}

 در مثال زیر نحوه واکشی داده ها را در Controller مشاهده می کنیم:

$authors = Author::all();
foreach ($authors as $author) {
  foreach ($author->books as $book) {
  // .. do something
  }
}

نکته : اگر بخواهیم فقط کتاب های نوشته شده در سال جاری را دریافت کنیم چه باید کرد؟ بسیار ساده است ، کافیه رابطه اصلی را به شکل زیر تغییر دهید:

public function books()
{
    return $this->hasMany(Book::class)->whereYear('books.created_at', date('Y'));
}

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

public function books()
{
    return $this->hasMany(Book::class);
}

public function booksThisYear()
{
    return $this->hasMany(Book::class)->whereYear('books.created_at', date('Y'));
}

و اینگونه داده ها را دریافت کنید :

foreach ($author->booksThisYear() as $book) ...

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

$authors = Author::with(['books' => function($query) {
  $query->whereYear('created_at', date('Y'));
}])->get();

به نظر من این راه انعطاف پذیر ترین است چون ارتباط اصلی باقی خواهد ماند .

نکته مهم : اگر شما بخواهید در کد فیلتر پرس و جو از متغیرهای خارجی استفاده کنید باید آنها را با استفاده از use به کوئری اضافه کنید.

 برای پرس وجو زیر از متغیر خارجی  $year استفاده می کنیم :

$year = 2018; // Feels weird writing it on January 2, still getting used to 2018
$authors = Author::with(['books' => function($query) {
  $query->whereYear('created_at', $year);
}])->get();

اگر شما از کد بالا استفاده کنید خروجی شما با خطا مواجه می شود، چون متغیر $year بیرون از محدوده پرس و جو تعریف شده، پس برای رفع این مشکل از روش زیر استفاده میکنیم :

$year = 2018; 
$authors = Author::with(['books' => function($query) use ($year) {
  $query->whereYear('created_at', $year);
}])->get();
لاراول
فقط
خوش آمدید!
ایجاد حساب کاربری