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);