19 شهریور 1398 ساعت 12:17

آموزش ایجادو استفاده از query scope در لاراول

شاید شما بخواهید یک شرط خاص را در تمام query های خود اعمال کنید. برای نمونه شاید فرض کنید شما جدولی بنام book در دیتابیس خود دارید که در آن کتاب هایی برای نمایش قرار داده شده است. لاراول برای حل کردن این مشکل و قابل خواندن کردن کد شما یک راه حل بنام Scope ارائه داده است.

اگر با لاراول کار کرده باشید حتما می دانید ORM قدرتمند این فریم وورک قابلیت های بسیاری برای شما فراهم آورده است. شما به راحتی می توانید query های خود را ایجاد و در بخش های مختلف وبسایت خود نمایش دهید.

اما شاید شما بخواهید یک شرط خاص را در تمام query های خود اعمال کنید. برای نمونه شاید فرض کنید شما جدولی بنام book در دیتابیس خود دارید که در آن کتاب هایی برای نمایش قرار داده شده است. حال شما می خواهید تنها کتاب هایی نمایش داده شود که visible آنها برابر 1 می باشد. بنابراین پرس و جوی شما بصورت زیر خواهد شد:

Book::where('status', 1)->get()

حال کمی پرس و جو را گستره تر کرده و میخواهیم تعداد 5 مطلب آخر در یک ماه اخیر که تعداد vote آن نیز بزرگتر از 9 باشد را دریافت کنیم. بنابراین پرس و جوی ما بصورت زیر خواهد بود:

Book::where('visible', 1)
    ->where('created_at', '>', Carbon::now()->subMonth())
    ->whereHas('votes', '>=', 10)
    ->limit(5)
    ->get();

 قصد داریم query بالا را با استفاده از scope باز نویسی کنیم:

اما Query Scopes چیست؟

برخی اوقات شما در شرایطی قرار می گیرید که نیاز دارید از یکسری شرط ها در بخش های مختلف برنامه ی خود استفاده نمایید. لاراول برای حل کردن این مشکل و قابل خواندن کردن کد شما یک راه حل بنام Scope ارائه داده است.

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

 

حال ما میخوایم پرس و جوی بالا را با استفاده از scope ها باز نویسی کنیم بنابراین مدل Book.php را بصورت زیر تغییر خواهیم داد:

protected static function boot()
{
    parent::boot();

    // A global scope is applied to all queries on this model
    // -> No need to specify visibility restraints on every query
    static::addGlobalScope('visible', function (Builder $builder) {
        $builder->where('visible', 1);
    });
    // Bonus: if multiple models are hideable, this behaviour might
    // belong in a specific scope for easy reuse
}

public function scopePopular($query)
{
    // By defining the conditions to be a popular book,
    // it's easy to change them later on for all queries at once
    return $query->whereHas('votes', '>=', 10);
}

public function scopeCreatedAfter($query, $date)
{
    // A scope can be dynamic and accept parameters
    return $query->where('created_at', '>', $date)
}

 

با دقت در کد بالا متوجه خواهید شد که ما در متد boot مدل از یک تابع بنام addGlobalScope بصورت استاتیک استفاده کرده ایم. این تابع بصورت پیش فرض در تمام کئوری های ما اعمال خواهد شد. سپس از دو تابع دیگر به نام های scopePopular و scopeCreatedAfter استفاده کرده ایم که با کمی دقت به راحتی متوجه کارکرد هرکدام از توابع خواهید شد.

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

Book::popular()
    ->createdAfter(Carbon::now()->subMonth())
    ->limit(5)
    ->get();

 

به این ترتیب و به راحتی ما می تواینم مطالب خود را با استفاده از scope ها نمایش دهیم.

 

ما در تابع boot تعریف کردیم که تنها ردیف هایی visible آنها برابر 1 باشد نمایش داده شود و این شرط در تمام پرس و جوهای ما اعمال خواهد شد. حال فرض کنید ما می خواهیم در یک کئوری این شرط را نقض و تمام ردیف ها را بدون توجه به یک بودن visible برگشت دهیم. بنابراین برای اینکار کافیست از عبارت without استفاده نماییم. برای نمونه کد زیر تمام ردیف ها را برای ما برگشت خواهد داد:

Book::withoutGlobalScope('visible')->get()

 

امیدوارم این آموزش برای شما مفید بوده باشه.

اگر سوالی دارید یا شما هم روش های دیگری برای تمیز نوشتن یا خلاصه نویسی سراغ دارید از بخش نظرات برای ما ارسال نمایید.

77 admin
نظرات

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

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

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

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