Skip to content

Filters

Queste classi possono essere applicate sia ai Fields già Esistenti che in quelli Custom.

La struttura di queste classi è sempre la stessa, estendono la classe DatasetFilter, e implementano due metodi:

apply()

Questo metodo riceverà in input in maniera automatica

ParametroDescrizione
Builder $builderIl builder Eloquent sul quale applicare la logica desiderata
InputFilter $filterIl valore che si sta cercando via filtro nella Datatable

Utilizzo e implementazione:

php
public function apply(Builder $builder, InputFilter $filter): Builder
{
    $query = RoleUser::query()
        ->select('role_user.user_id')
        ->join('roles', 'roles.id', '=', 'role_user.role_id')
        ->whereRaw($filter->sql('roles.id'), $filter->value());

    return $builder->whereIn('users.id', $query);
}

Il metodo ...->sql() della classe InputFilter ritornerà la stringa che corrisponde al {colonna} {operatore} quindi (roles.id =).

Il metodo ...->value() ritornerà il valore scelto dall'utente.

applyGlobal()

Questo metodo riceverà in input in maniera automatica

ParametroDescrizione
Builder $builderIl builder Eloquent sul quale applicare la logica desiderata
string $searchIl valore scritto dall'utente nella barra di ricerca

Utilizzo e implementazione:

php
public function applyGlobal(Builder $builder, string $search, array $field, array $fields): Builder
{
    /** Uso il parametro $search applico una particolare logica per filtrare i dati sul DB*/

    $values = LocalUnit::get()
        ->filter(function(LocalUnit $localUnit) use ($search) {
            return \Str::contains(\Str::lower($localUnit->name), \Str::lower($search));
        })
        ->pluck('id')
        ->all();


    $query = Employment::query()
        ->select('employments.user_id')
        ->join('contracts', 'contracts.id', '=', 'employments.contract_id')
        ->whereIn('contracts.local_unit_id', $values);

    /** Uso poi i risultati ottenuti come filtro nella query */
    return $builder->orWhereIn('users.id', $query);
}