سلام. فرض کنید یه سری دیتا داریم که فعال یا غیرفعال بودنشون رو از طریق فیلد status چک می کنیم. حالا من می خوام یه کاری کنم model فقط دیتاهایی رو برگردونه که دارای status=1 هستند و دیگه هر بار مجبور نباشم این رو توی Controller و متدهام بزنم.
راه حلی داره؟
شما باید یک 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
@ali.bayat
این روش برای query های با دیتای بالا که مشکل ایجاد نمیکنه؟ مثلا سنگین ترش بکنه؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟