Erstellen Sie eine Abfrage mit einer bedingten WHERE-Klausel im eloquenten Modell
Frage
Ich muss eine Abfrage mit einem eloquenten Modell einschließlich der bedingten Where-Klausel erstellen.Ich habe durch eine Google-Suche etwas erstellt.Aber es scheint nicht zu funktionieren.
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);
Dieser gibt alle Ergebnisse ohne Filterung nach Status, Zuweisung und Datum zurück.
Lösung
Ich habe es gerade durch Zuweisen aktualisiert $this
zu einer neuen Variablen, weil ich die Abfrage zugewiesen habe $this
, es zeigte einen Fehler, $this
kann nicht überschrieben werden.
$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);
was jetzt perfekt funktioniert.Aber wenn jemand eine bessere Option hat, schlagen Sie es bitte vor.Danke.
Andere Tipps
Ich habe meinem Modell einen Bereich hinzugefügt und ihn über den Controller aufgerufen.Auf diese Weise wird die eigentliche Filterarbeit im Modell erledigt, der Controller führt lediglich die Abfrage durch den Filterbereich aus.
Modell:
Ich erhalte URL-Parameter mit Input::get
, aber Sie würden sie auch als Eingabeparameter an die Funktion übergeben.
public function scopeFilter($query)
{
$published = Input::get('published');
if (isset($published)) $query->where('published', '=', $published);
return $query;
}
Regler:
Hier wird die Abfrage durchlaufen filter()
bevor Sie es zur Ansicht zurückbringen.
public function index()
{
return View::make('articles.index', [
'articles' => Article::with('writer')->filter()->get()
]);
}