I have a stuents tablle with 3 columns graduated , leaver and deleted_at.
graduated and leaver are int (1) with null as default value. When a student graduates or leaves the school, the corresponding columns becomes 1.
When i use
$students=Student::get();
I need to only return Student where graduated and leaver are null, so I create two global scopes:
protected static function boot()
{
parent::boot();
static::addGlobalScope('onlyGraduated', function ($builder) {
$builder->where('graduated', null);
});
static::addGlobalScope('onlyLeaver', function ($builder) {
$builder->where('leaver', null);
});
}
This works for most use cases, but what should I do for some specific queries when I want the students thar are graduated? such as
Students::where("graduated",1)->get();
Advertisement
Answer
If you need to avoid a global scope in a specific query, yuu should use withoutGlobalScope:
Students::withoutGlobalScope('onlyGraduated')->where("graduated",1)->get();
I would create a local scope in your Model called graduated and leaver:
public function scopeGraduated($query) {
return $query->withoutGlobalScope('onlyGraduated')->where("graduated",1);
}
public function scopeLeavers($query) {
return $query->withoutGlobalScope('onlyLeaver')->where("leaver",1);
}
Then you will be able to query the data using:
Students::get(); // Only students with both graduated and leaver null Students::graduated()->get(); // Students with leaver null and graduated 1 Students::leavers()->get(); // Students with leaver 1 and graduated null