I am developing a multi-tenant web app with laravel 8 and livewire and I have a problem with filters and pagination. The application is a management software through which the user displays report data in tables (created as livewire components), which are paginated and from which he can obtain filtered data. Examples of filters are anno, procedura, etc ... When filters are applied to the tables, they return the data correctly filtered and paginated, but if the page is changed, the filters are not kept and therefore all the rows are shown again.
Anyone have any advice or ideas? I can't understand what is causing this problem ... thanks everyone for the help :-)
here my code:
- TablePratiche
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use Illuminate\Http\Request;
use App\Models\AnagraficaSoggetto;
class TablePratiche extends Component
{
use WithPagination;
protected $paginationTheme = 'bootstrap';
public function render()
{
return view('livewire.table-pratiche');
}
}
-TablePraticheContent
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use Illuminate\Http\Request;
use App\Models\AnagraficaSoggetto;
class TablePraticheContent extends Component
{
use WithPagination;
protected $paginationTheme = 'bootstrap';
protected $connection = null;
public $pratiche = null;
protected $listeners = ['filtri' => 'renderWithFilter'];
public function mount(Request $request)
{
// Setto la connessione
if (null !== $request->get('throughMiddleware')) {
$this->connection = 'tenant';
} else {
$this->connection = null;
}
// Recupero i dati da renderizzare
$anagrafica = new AnagraficaSoggetto();
$anagrafica->setConnection($this->connection);
$this->pratiche = $anagrafica->select(
'denominazioneSoggetto',
'anagrafica_soggetto.codiceFiscale',
'indirizzoPOSTA',
'tipologia_imposta.descrizione_sintetica',
'importoCarico as carico',
'importoResiduo as residuo',
'pagatoNormale as riscosso',
'pagatoDiscarico as sgravio',
'data_assegnazione',
'username as collaboratore',
'minuta_partita.id',
'minuta_partita.id_minuta as id_minuta',
'partita_pagamenti.progressivoRiscossione',
'partita_pagamenti.agenteRiscossione',
)->distinct()
->join('minuta_partita', 'minuta_partita.id_soggetto', '=', 'anagrafica_soggetto.id')
->join('users', 'minuta_partita.id_user', '=', 'users.id', 'left outer')
->join('partita_pagamenti', 'partita_pagamenti.id_minuta_partita', '=', 'minuta_partita.id', 'left outer')
->join('tipologia_imposta', 'minuta_partita.id_tipologia_imposta', '=', 'tipologia_imposta.id')
->paginate(15)
->toArray();
//dd($this->pratiche);
}
//funzione per triggerare l'evento onclick sulla tabella pratiche
public function clickPartiteTrigger($id)
{
$this->emit('getPartite', $id);
// questo evento passa al gestionale-modal-component l'id della pratica
//in questo modo possiamo prenderlo per l'apertura del modal
$this->emit('getPratica', $id);
}
public function render()
{
return
view('livewire.table-pratiche-content')
->with('pratiche', $this->pratiche);
}
public function renderWithFilter($filtered)
{
$this->pratiche = $filtered;
//dd($this->pratiche);
}
}
-GestionaleHeaderFilter
<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Illuminate\Http\Request;
use App\Models\MinutaPartita;
use App\Models\AnagraficaSoggetto;
use App\Models\TipologiaImposta;
use Illuminate\Support\Facades\DB;
use Livewire\WithPagination;
use App\Tenant;
class GestionaleHeaderFilter extends Component
{
protected $paginationTheme = 'bootstrap';
protected $connection = null;
public $first_render = true;
public $filtered = null;
public $nomi_imposta = null;
public $anni_riferimento = null;
// Definiamo l'array dei filtri (anno, tipo imposta, procedure, inesigibilita, residui)
public $filter = [
'anno' => '', // filtro per anno
'procedura' => '', // filtro per procedura
'inesigibilita' => '', // filtro per inesigibilita
'imposta' => '', // filtro per tipo imposta
'residui' => '' // filtro per residui
];
public function mount(Request $request)
{
if (null !== $request->get('throughMiddleware')) {
$this->connection = 'tenant';
} else {
$this->connection = null;
}
$this->nomi_imposta = TipologiaImposta::on($this->connection)
->select('id', 'descrizione_sintetica', 'descrizione_imposta')
->orderBy('descrizione_imposta', 'ASC')
->get()
->toArray();
$this->anni_riferimento = MinutaPartita::on($this->connection)
->select('annoRiferimento')
->distinct()
->orderByDesc('annoRiferimento')
->get()
->toArray();
}
public function filtri()
{
if (null !== request()->get('throughMiddleware')) {
$this->connection = 'tenant';
} else {
$this->connection = null;
}
$options = array();
// Recupero le le condizioni di where
if ($this->filter['anno'] != '') {
$options['minuta_partita.annoRiferimento'] = $this->filter['anno'];
}
if ($this->filter['imposta'] != '') {
$options['tipologia_imposta.id'] = $this->filter['imposta'];
}
if ($this->filter['procedura'] != '') {
$options['proceduraEsecutiva'] = $this->filter['procedura'];
}
if ($this->filter['inesigibilita'] != '') {
$options['inesigibilita'] = $this->filter['inesigibilita'];
}
$anagrafica = new AnagraficaSoggetto();
$anagrafica->setConnection($this->connection);
$pratiche = $anagrafica->select(
'denominazioneSoggetto',
'anagrafica_soggetto.codiceFiscale',
'indirizzoPOSTA',
'tipologia_imposta.descrizione_sintetica',
'importoCarico as carico',
'importoResiduo as residuo',
'pagatoNormale as riscosso',
'pagatoDiscarico as sgravio',
'data_assegnazione',
'username as collaboratore',
'id_minuta_partita',
'minuta_partita.id_minuta as id_minuta',
'partita_pagamenti.progressivoRiscossione',
'partita_pagamenti.agenteRiscossione',
)->distinct()
->join('minuta_partita', 'minuta_partita.id_soggetto', '=', 'anagrafica_soggetto.id')
->join('partita_pagamenti', 'partita_pagamenti.id_minuta_partita', '=', 'minuta_partita.id', 'left outer')
->join('users', 'minuta_partita.id_user', '=', 'users.id', 'left outer')
->join('tipologia_imposta', 'minuta_partita.id_tipologia_imposta', '=', 'tipologia_imposta.id');
foreach ($options as $key => $value) {
$pratiche = $pratiche->where($key, '=', $value);
}
if ($this->filter['residui'] != '') {
$pratiche = $pratiche->where('importoResiduo', '>', '0');
}
$this->filtered = $pratiche->paginate(15)->toArray();
$this->emit('filtri', $this->filtered);
}
public function render()
{
return view('livewire.gestionale-header-filter')
->with('nomi_imposta', $this->nomi_imposta)
->with('anni', $this->anni_riferimento);
//->with('idt', $idt);
}
}