آموزش جستجو در چند جدول یا یک query در لاراول

آموزش جستجو در چند جدول یا یک query در لاراول

به این صورت شما میتوانید در لاراول با یک query در چندین جدول مختلف عملیات جستجو را انجام دهید.

فریم وورک لاراول با ORM قدرتمند خود توابع بسیار خوبی را در اختیار توسعه دهندگان قرار داده است تا با استفاده از این توابع بتوانند بسیار راحت تر و سریعتر اپلیکشن های خود را توسعه دهند.

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

مشکل چیست:

فرض کنید ما یک فیلد جستجو داریم که کاربران با استفاده از می توانند نام یک محصول یا دسته بندی آن را جستجو کنند. 

بنابراین وقتی که کاربر برای نمونه، دوربین ها را جستجو کرد باید تمام موارد در دسته دوربین ها برای آن نمایش داده شود و اگر مثلا "Lumix DMC-GM1" را جستجو کرد باید محصول با این عنوان را نمایش دهد.

 

تصور کنید ما دو مدل با نام Product', و  'Category' داریم که بین آنها رابطه ی one-to-many وجود دارد.

// app/models/Product.php
class Product {
  ...

  public function category() {
    return $this->belongsTo('Category', 'product_category');
  }
}
// app/models/Category.php
class Category {
  ...

  public function product() {
    return $this->hasMany('Product', 'category_id');
  }
}

 

اطلاعات ما بصورت زیر ذخیره خواهند شد:

Products Categories
productid_ categoryid_
product_name category_name
product_category * category_slug
... ...

فیلد product_category به فیلد category_id اشاره دارد.

 

شما می توانید کار جستجو در این جداول را با چند query ساده حل کنید اما بهترین راه این است که ما درخواست های خود را از پایگاه داده به حداقل برسانم. پس اینجاست که می توانید از ORM قدرتمند لاراول و توابع آن کمک بگیریم تا علاوه بر انجام سریعتر کار، کدهای تمیزتری نیز داشته باشم.

 

راه حل:

کد بایانی ما بصورت زیر خواهد بود:

$products = Product::whereHas('category', function($query) use($term) {
    $query->where('category_name', 'like', '%'.$term.'%');
})->orWhere('product_name','LIKE','%'.$term.'%')->orderBy($order, 'asc')->get();

 

توضیح کد:

در ابتدا ما تمام محصولاتی را دریافت میکنیم که دسته بندی آن اسمی مشابه اسم جستجو شده دارند. این کار با استفاده از تابع category() موجود در روابط بالا استفاده خواهد شد.

Product::whereHas('category', function($query) use($term) {
    $query->where('category_name', 'like', '%'.$term.'%');
})

 

حال اگر درخواست اول (کدبالا) نتیجه ای در بر نداشت ما با استفاده از کد زیر به جستجو در محصولات خواهیم پرداخت:

->orWhere('product_name','LIKE','%'.$term.'%')->get();

 

بصورت خلاصه:

تابع whereHas تمام دسته هایی را برای شما برخواهد گرداند که فیلد category_name آن مشابه عبارت جستجو شده باشد.

سپس با استفاده از تابع orWhere در جدول Product جستجو انجام می شود و تمام محصولاتی که product_name آنها شبیه عبارت جستجو شده می باشد را برخواهد گرداند.

 

به این صورت شما میتوانید در لاراول با یک query در چندین جدول مختلف عملیات جستجو را انجام دهید.

 

 

درصورتی که سوالی یا پیشنهادی دارید از بخش نظرات ارسال نمایید 


دسته بندی ها:

لاراول

ارسال نظر

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!
لسیت نظرات
هنوز برای این مطلب نظری ارسال نشده است!