Skip to content

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.

php
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:

php
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:

php
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:

php
$date = Carbon::parse("2023-10-10");

$user->absences()->inDate($date);