محمد صادقیان
5 سال پیش توسط محمد صادقیان مطرح شد
3 پاسخ

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

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


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

@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

محمد صادقیان
تخصص : برنامه نویس وب - فریم ورک Lara...
@drcode.ir 5 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

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


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

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