Gestione di query dinamiche complesse in Laravel 5

1

Sto sviluppando un progetto usando Laravel. Il mio flusso di lavoro è:

  • indirizza al controllore
  • Il controller chiama i modelli eloquenti
  • I modelli eloquenti eseguono query (tipicamente CRUD e trova)
  • Controller restituisce una vista o una stringa JSON

Ultimamente mi rendo conto che le mie domande stanno diventando troppo complesse. Complesso abbastanza da trovarmi a scrivere alcune parti della query a mano. Ad esempio:

Employee::withoutGlobalScopes()
->join('positions', 'employees.position_id', '=', 'positions.position_id')
->where(['employees.project_id'=>$project_id, 'employees.employment_type'=>'agency', 'positions.type'=>'worker', 'employees.status'=>'active'])
->orderBy('employees.first_name')->select('employees.*', 'positions.name as position_name', 'positions.level as position_level'))
->filter(function($query) use($searchValue)
{ // really easier as raw than calling orWhere
    $query->whereRaw("(LOWER('employees'.'first_name') LIKE '%$searchValue%' or LOWER('employees'.'middle_name') LIKE '%$searchValue%' or LOWER('employees'.'last_name') LIKE '%$searchValue%' or LOWER('positions'.'name') LIKE '%$searchValue%')");
});

Questa query è in un controller. Questo significa che i miei controllori stanno facendo due cose adesso. Generazione di query dinamiche e reindirizzamento di richieste e risposte. Inoltre, questa query potrebbe essere inserita in una funzione per il riutilizzo (anche nel controller).

Ora ho due posizioni che eseguono query sul database: controller e modelli (sebbene eloquente lo generi da solo). Sembra che le query non siano abbastanza astratte.

Ho pensato a due soluzioni.

  • Metti tutte le query all'interno di Eloquent. Questo presenta un problema se ho scelto di utilizzare un normale generatore di query invece di un generatore di query eloquente.
  • Crea un altro oggetto che gestisce la generazione di query. Ad esempio, un repository Employee contiene tutte le query relative ai dipendenti. Questo risolve il problema sulla prima soluzione, posso usare qualsiasi generatore di query liberamente, ma sembra che sto creando troppa astrazione. E questo può essere troppo lavoro per alcune attività molto banali (E.G. eloquente ha un metodo di salvataggio, dovrei creare un metodo di salvataggio nel repository solo così il controller può chiamarlo?).

Queste soluzioni non sembrano essere l'ideale. Ho ragione? Se sì, c'è un modo migliore?

    
posta morbidCode 10.09.2018 - 19:33
fonte

0 risposte

Leggi altre domande sui tag