Scopes
Il concetto di Scope, può essere diviso in due:
Globale
Alla generazione della risorsa, verrà creata una classe di scope globale dedicata a quest'ultima. Il concetto di Scope Globale può essere riassunto come la costante logica applicata al Builder Eloquent
per tutte le query che la coinvolgono.
class AbsencesScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$user = \Auth::user();
if ($user && !$user->isSuperadminOrAdmin()) {
$builder->where("user_id", "=", $user->id);
}
}
}
N.B. E' altamente consigliato innestare gli scope, per farlo basterà semplicemente:
class AbsenceDetailsScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$user = \Auth::user();
if ($user && !$user->isSuperadminOrAdmin()) {
$builder->whereIn("absence_id", "=", Absence::select(["id"]));
}
}
}
Locale
All'interno del Model della risorsa voluta, si possono creare specifici metodi che è possibile utilizzare per mantenere il codice pulito ma soprattutto in un unico punto. Questi metodi "speciali", si definiscono usando il prefisso "scope"
. Un esempio che può essere scritto dentro il model User
:
public function scopeInDate(Builder $builder, Carbon $date)
{
return $builder->where("absences.date", "=", $date->format("Y-m-d"))
}
Attenzione a non dimenticare che il primo parametro dovrà sempre essere il Builder Eloquent
, gli altri sono a discapito del programmatore.
Modalità d'uso
Per utilizzare un local scope basterà semplicemente chiamarlo in maniera classica, ma senza il prefisso "scope"
e facendo il lower case della lettera succesiva a quest ultimo:
$date = Carbon::parse("2023-10-10");
$user->absences()->inDate($date);