راکت
حل شده

نحوه تعریف where از طریق model

3 پاسخ

سلام. فرض کنید یه سری دیتا داریم که فعال یا غیرفعال بودنشون رو از طریق فیلد status چک می کنیم. حالا من می خوام یه کاری کنم model فقط دیتاهایی رو برگردونه که دارای status=1 هستند و دیگه هر بار مجبور نباشم این رو توی Controller و متدهام بزنم.
راه حلی داره؟

ثبت پرسش جدید

پاسخ‌ها

3
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

@drcode.ir

شما باید یک Global Scope تعریف کنید.

یک کلاس با پیاده‌سازی از اینترفیس Illuminate\Database\Eloquent\Scope بوجود بیارید و متد apply هم درش قرار بدید.
بطور مثال: App\Scopes\ActiveUsersScope.php

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ActiveUsersScope implements Scope
{

    public function apply(Builder $builder, Model $model)
    {
        $builder->where('active', 1);
    }
}

سپس برای استفاده از کلاسی که تعریف کردید٬ داخل متد boot مدل موردنظر از addGlobalScope استفاده میکنید:

<?php

namespace App;

use App\Scopes\ActiveUsersScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{

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

        static::addGlobalScope(new ActiveUsersScope);
    }
}

بعد از انجام مراحل بالا متد User:all شما کوئری زیر رو بوجود میاره و فقط کاربرهای فعال رو برمی‌گردونه.

select * from users where active = 1
محمد صادقیان
محمد صادقیان
@drcode.ir

تخصص: برنامه نویس وب - فریم ورک Laravel

@ali.bayat
این روش برای query های با دیتای بالا که مشکل ایجاد نمیکنه؟ مثلا سنگین ترش بکنه؟

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

@drcode.ir
خیر ٬ این روش تنها یک Where به تمام کوئری‌های مدل اضافه میکنه. موفق باشید

شاید پاسخ شما همین‌جا باشد

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

ورود یا ثبت‌نام