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
JavaScript
x
$students=Student::get();
I need to only return Student where graduated
and leaver
are null, so I create two global scopes:
JavaScript
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
JavaScript
Students::where("graduated",1)->get();
Advertisement
Answer
If you need to avoid a global scope in a specific query, yuu should use withoutGlobalScope
:
JavaScript
Students::withoutGlobalScope('onlyGraduated')->where("graduated",1)->get();
I would create a local scope in your Model called graduated
and leaver
:
JavaScript
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:
JavaScript
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