在我使用Laravel 8开发的应用程序中,我需要根据称为identificativoPartita
的字段从数据库检索值。
特别地,该字段总是按照以下结构来取值:value = "A1_ (sequence of number)"
或value = "F1_ (sequence of number)"
。
我要做的是采取identificativoPartita
字段的子字符串并将其应用于where子句,但我不知道如何做到这一点。
这是因为我必须根据用户进行检查,然后只显示符合适当标准的结果
对如何实现这个目标有什么建议或想法吗?
我代码:
namespace AppHttpLivewire;
use LivewireComponent;
use LivewireWithPagination;
use IlluminateHttpRequest;
use AppModelsAnagraficaSoggetto;
use AppModelsTipologiaImposta;
use AppModelsMinutaPartita;
use IlluminateSupportFacadesAuth;
class TablePratiche extends Component
{
use WithPagination;
protected $paginationTheme = 'bootstrap';
protected $collection = null;
public $filtered = "false";
public $connection = null;
protected $pratiche = null;
//renderizziamo le pratiche a seconda dei filtri
protected $listeners = [
'filter' => 'renderWithFilter'
];
// footer filter della tabella pratiche
public $filter = [
'anno' => '', // filtro per anno
'procedura' => '', // filtro per procedura
'inesigibilita' => '', // filtro per inesigibilita
'imposta' => '', // filtro per tipo imposta
'residui' => '', // filtro per residui
'soggetto' => '',
'cf' => '',
'assegnatario' => '',
];
public $markedRows = null;
public $nomi_imposta = null;
public $anni_riferimento = null;
public function mount(Request $request)
{
// Settiamo la connessione
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();
// recuperiamo le pratiche da renderizzare
$this->getData();
}
public function render()
{
$this->getData();
return view('livewire.table-pratiche')
->with('pratiche', $this->pratiche)
->with('markedRows', $this->markedRows)
->with('anni', $this->anni_riferimento)
->with('nomi_imposta', $this->nomi_imposta);
}
public function pageReset()
{
$this->resetPage();
}
private function getData($exporting = false)
{
$anagrafica = new AnagraficaSoggetto();
$anagrafica->setConnection($this->connection);
if (
empty($this->filter['anno']) &&
empty($this->filter['procedura']) &&
empty($this->filter['inesigibilita']) &&
empty($this->filter['imposta']) &&
empty($this->filter['residui']) &&
empty($this->filter['soggetto']) &&
empty($this->filter['cf']) &&
empty($this->filter['assegnatario'])
) {
$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',
'minuta_partita.identificativoPartita',
'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');
} else {
$options = array();
// Recupero le le condizioni di where
if ($this->filter['soggetto'] != '') {
$options['anagrafica_soggetto.denominazioneSoggetto'] = $this->filter['soggetto'];
}
if ($this->filter['cf'] != '') {
$options['anagrafica_soggetto.codiceFiscale'] = $this->filter['cf'];
}
if ($this->filter['assegnatario'] != '') {
$options['username'] = $this->filter['assegnatario'];
}
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'];
}
$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.identificativoPartita',
'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, 'LIKE', '%' . $value . '%');
}
if ($this->filter['residui'] != '') {
$pratiche = $pratiche->where('importoResiduo', '>', '0');
}
}
// Pagino e faccio to array alla collection per la visualizzazione in frontend
if (false === $exporting) {
// HERE I NEED TO ACHIEVE MY GOAL
//Mostriamo le pratiche a seconda degli uffici associati all'utente ( A1, F1, A1&F1, niente)
if (isset(Auth::user()->permessi_uffici)) {
if (Auth::user()->permessi_uffici == 'A1') {
$this->pratiche = $pratiche->where(substr('minuta_partita.identificativoPartita', 0, 2), '=', 'A1')->paginate(15);
} elseif (Auth::user()->permessi_uffici == 'F1') {
$this->pratiche = $pratiche->where(substr('minuta_partita.identificativoPartita', 0, 2), '=', 'F1')->paginate(15);
} elseif (Auth::user()->permessi_uffici == 'ALL') {
$this->pratiche = $pratiche->paginate(15);
} else {
$this->pratiche = null;
}
} else {
$this->pratiche = $pratiche->paginate(15);
}
} else {
return $pratiche;
}
}
//funzione per triggerare l'evento onclick sulla tabella pratiche
public function clickPartiteTrigger($id, $idrow)
{
$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);
$this->markRow($idrow);
}
public function filtri()
{
$this->getData();
}
public function markRow($id)
{
$this->markedRows = null;
$this->markedRows = $id;
//dd($this->markedRows);
}
}
首先,我建议考虑修改数据库模式,因为在一个字段中存储了两段数据。连接两个字段来创建minuta_partita.identificativoPartita
要比通过它进行子字符串更容易。
接下来,为了实际解决这个问题,我将创建一个使用whereRaw
的作用域,例如whereRaw('SUBSTRING(table.col, 0, 2)')
或其他东西。
如果每次都需要这样做,你可以在启动事件上应用这个。