Costruisci una query con Conditional dove la clausola in modello eloquente
Domanda
Ho bisogno di costruire una query con il modello eloquente compresa la clausola condizionale dove.Ho creato qualcosa cercando Google.Ma non sembra funzionare.
if ($status) {
$this->where('status', $status);
}
if ($assignedto) {
$this->where('assigned_to', $assignedto);
}
if ($fromDate != null && $toDate != null) {
$this->whereBetween('date', array($fromDate, $toDate));
}
$quotes = $this->orderBy('date', 'desc')->paginate(40);
.
Questo restituisce tutti i risultati senza il filtraggio dello stato, assegnato a e date.
Soluzione
L'ho appena aggiornato assegnando $this
a una nuova variabile perché quando ho assegnato la query a $this
, ha mostrato un errore, $this
non può essere scritto.
$quoteModel = $this;
if ($status) {
$quoteModel = $quoteModel->where('status', $status);
}
if ($assignedto) {
$quoteModel = $quoteModel->where('assigned_to', $assignedto);
}
if ($fromDate != null && $toDate != null) {
$quoteModel = $quoteModel->whereBetween('date', array($fromDate, $toDate));
}
$quotes = $quoteModel->orderBy('date', 'desc')->paginate(40);
.
che funziona perfettamente ora.Ma se qualcuno ha qualche opzione migliore, ti preghiamo di suggerire.Grazie.
Altri suggerimenti
Ho aggiunto una portata al mio modello e chiamalo dal controller.In questo modo il funzionamento del filtro effettivo viene eseguito nel modello, il controller è solo in esecuzione la query attraverso l'ambito del filtro.
Modello:
Sto ricevendo parametri URL con Input::get
, ma li passerai anche come parametri di input alla funzione.
public function scopeFilter($query)
{
$published = Input::get('published');
if (isset($published)) $query->where('published', '=', $published);
return $query;
}
.
Controller:
Qui la query viene eseguita attraverso il filter()
prima di restituirlo alla vista.
public function index()
{
return View::make('articles.index', [
'articles' => Article::with('writer')->filter()->get()
]);
}
.