【问题标题】:Laravel 8 - Where query with substringLaravel 8 - 带有子字符串的查询
【发布时间】:2021-10-30 01:01:22
【问题描述】:

在我使用 Laravel 8 开发的应用程序中,我需要根据名为 identificativoPartita 的字段从数据库中检索值。

特别是,此字段始终根据以下结构进行赋值:value = "A1_ (sequence of number)"value = "F1_ (sequence of number)"

我要做的是获取identificativoPartita 字段的子字符串并将其应用于 where 子句,但我不知道该怎么做。

这是因为我必须根据用户进行检查,然后只显示符合相应条件的结果

对如何实现目标有任何建议或想法?

我的代码:

namespace App\Http\Livewire;

    use Livewire\Component;
    use Livewire\WithPagination;
    use Illuminate\Http\Request;
    use App\Models\AnagraficaSoggetto;
    use App\Models\TipologiaImposta;
    use App\Models\MinutaPartita;
    use Illuminate\Support\Facades\Auth;
    
    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);
        }
    }



【问题讨论】:

    标签: php mysql eloquent laravel-8


    【解决方案1】:

    首先,我会说考虑修改您的数据库架构,因为您有两个数据存储在一个字段中。连接两个字段以创建 minuta_partita.identificativoPartita 比通过它创建子字符串更容易。

    接下来,要真正解决问题,我会创建一个使用whereRaw 的作用域,例如whereRaw('SUBSTRING(table.col, 0, 2)') 或其他东西。

    如果每次都需要这样做,您可以将其应用于启动事件。

    【讨论】:

    • 我应该说,如果我正确理解您的问题。如果我说不难理解,因为上下文是另一种语言,那我是在撒谎,但这不是你的错。
    • 如果我能让他们更清楚,我会解释我应该达到的结果。我的字段minute_partita.identificativoPartita 由一个固定长度的字符串组成,其中前两个字符始终是 A1 或 F1,其他字符是数字序列。正如您从我的代码中看到的那样,我使用 if-else 构造来检查用户拥有哪些权限(A1、F1 或两者)只有前两个字符,即A1或F1,然后根据用户的权限显示结果。
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多