Laravel DataTable: filtrare per data

Fra i programmatori PHP di passaggio ce ne sarà senz’altro qualcuno che utilizza il framework Laravel come base per il proprio progetto. E qualcuno forse utilizza DataTable per creare facilmente delle viste dei propri dati su database. Se non conoscete DataTable, ve lo consiglio perché vi risparmia un sacco di lavoro sporco con HTML e JavaScript, permettendovi di utilizzare il vostro tempo per qualcos’altro. Vi consiglio in particolare il pacchetto yajra/laravel-datatables. La cosa strana di quest’ottima integrazione è che nessuno abbia pensato all’eventualità di filtrare i risultati per data e ora, se presenti del database. Immaginiamo per esempio di gestire il database di una biblioteca e di avere un elenco di libri con la data di prestito. Non sarebbe utile filtrare, per esempio, i libri prestati un dato giorno, e quindi in scadenza? Fortunatamente non è difficile.

Non mi dilungherò sul modo di utilizzare il pacchetto consigliato: mi aspetto che se siete arrivati a quest’articolo abbiate già una tabella funzionante. In caso contrario, i tutorial non mancano, e vi consiglio di basarvi sulla documentazione e gli esempi forniti insieme al pacchetto.
Presumerò che abbiate creato la vostra estensione della classe DataTable e che la stiate usando per la resa sia degli script che del codice HTML.

Per prima cosa avrete bisogno di due campi di input per inserire l’intervallo di date desiderato:

<input type="date" id="data_minima">
<input type="date" id="data_massima">

Usando il tipo date per i campi, il browser si occuperà da sé di mostrare un piccolo calendario da cui scegliere la data iniziale e la data finale senza bisogno di librerie esterne.
Ora, nella vostra classe DataTable avete sicuramente il vostro metodo html, che andrà modificato così:

public funcion html() {
  return $this->builder
    ->minifiedAjax('', '
      data.data_minima  = $("#data_minima");
      data.data_massima = $("#data_minima");
    )
    // ... etc
}

Ciò aggiungerà allo script finale le istruzioni per includere le due date ai filtri inviati al server per la selezione dei dati. A questo punto dobbiamo modificare anche la funzione dataTable perché le utilizzi:

public funcion dataTable($query) {
  return datatables()
    ->eloquent($query)
    // ... etc
    ->filter(function ($query) {
      if (request('data_minima')) {
        $query->where('data', '>=', request('data_minima'));
      }
      if (request('data_massima')) {
        $query->where('data', '<=', request('data_massima'));
      }
    }, true);
}

Fatto. Ora dovreste poter selezionare la data dai nuovi campi ed i dati saranno immediatamente filtrati.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *