چرایی و چگونگی استفاده از Query Scope در لاراول

در این مقاله به چگونگی ایجاد و استفاده از Query Scopeدرelloquent های مدل لاراول میپردازیم. همچنین نحوه ایجاد و استفاده آن بصورت پویا در برنامه های وب لاراول را نشان میدهیم.

هنگامیکه شما روی برنامه های کوچک و بزرگ لاراولی کار میکنید، متوجه میشوید که گرفتن داده ها توسط کوئری ها بعضا تکراری و ممکنه زمانبر باشد که در این شرایط استفاده از Query Scope ها بسیار سودمند است و شما براحتی میتوانید با استفاده از Query Scope ها اطلاعات لازم را از دیتابیس خود دریافت کنید.

به عبارتی دیگر شما با استفاده از Query Scope های لاراول در وقت خود برای نوشتن کد دوباره و دوباره، صرفه جویی کرده اید و همچنین می توانید به راحتی کوئری های خود را بارها مورد استفاده قرار دهید.

تعریف Query Scope در مدل لاراول

ساخت Basic Scope در مدل

اکنون ، شما می توانید نحوه ایجاد و استفاده از دامنه را در مدل لارولا خود بیاموزید. شما می توانید مانند:

برای ایجاد و استفاده از scope در مدل خود بصورت زیر عمل میکنیم. بطور مثال مدل پستی داریم که از کوئری مربوط به گرفتن پست های فعال بسیار استفاده میکنیم.

 $query->where('status', 1);

بجای استفاده مدام از کوئری بالا در تمام برنامه ی خود به شکل زیر Query Scope تعریف میکنیم.

<?php
 namespace App; 
use Illuminate\Database\Eloquent\Model; 
class Post extends Model { 
    public $table = "posts"
     protected $fillable = [
       'id', 'title', 'body', 'status'     
]
     public function scopeStatus($query)
     {        
        return $query->where('status', 1);
      } 
}
 ?>

چگونگی استفاده از آن در کنترل یا جاهای دیگر

حال شما برای استفاده از query scope فقط لازم است به شکل زیر عمل کنید:

Post::status()->get(['id','title']);

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

چگونگی تعریف Query Scope پویا (Dynamic) در مدل لاراول

مرحله بعدی، دانستن این موضوع است که چگونه Query Scope را میتوان بصورت داینامیک استفاده کرد. خیلی راحت در مدل مثلا پست بصورت زیر:

<?php
  namespace App;
  use Illuminate\Database\Eloquent\Model;
  class Post extends Model
 {
      public $table = "posts"
      protected $fillable = [
        'id', 'title', 'body', 'status'
      ]
      public function scopeStatus($query,$type)
      {
                 return $query->where('status', type);
       }
  }
  ?>

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

Post::status(1)->get(['id',title']);

استفاده از scope در Relation های لاراول

حال وقتشه که بدانیم که در relation ها به چه صورت مورد استفاده قرار میگیرند. مثلا در نظر بگیرید که هر بسته بندی ای تعداد زیادی پست دارد .مانند زیر:

class Category extends \Eloquent

{

    public function posts()

    {

        return $this->HasMany('Post');

    }

}

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

class Post extends \Eloquent
 {
    public function category()
    {
        return $this->belongsTo('Category');
    }
 public function scopePublished($query)
    {
        return $query->where('published', 1);
    }
 }

حال به چه صورت این رابطه را فراخوانی میکنیم؟ بصورت زیر:

$categories = Category::with(['posts' => function ($q) {

  $q->published();

}])->get();

حال اگر تا اینجا متوجه داستان شدین و مایل بودین که بیشتر بدانید میتوانید از داکیومنت لاراول کمک بگیرید و اینجا کلیک کنید.