Question

J'ai besoin de construire une requête avec éloquent modèle, y compris conditionnelle de la clause where.J'ai créé quelque chose en cherchant sur google.Mais il n'a pas l'air de fonctionner.

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);

Celle-ci rentre tous les résultats sans le filtrage de l'état, attribué à et les dates.

Était-ce utile?

La solution

Je viens de mettre à jour en attribuant $this à une nouvelle variable parce que quand j'ai assigné à la requête de $this, il montre une erreur, $this ne peut pas être écrasée.

$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);

qui fonctionne parfaitement maintenant.Mais si quelqu'un avez une meilleure option, s'il vous plaît suggérer.Merci.

Autres conseils

J'ai ajouté un champ à mon modèle et l'appeler à partir du contrôleur.De cette façon, le réel travail de filtrage est fait dans le modèle, le contrôleur est juste en cours d'exécution de la requête par le biais de la portée de filtre.

Modèle:

Je reçois des paramètres d'URL avec Input::get, mais vous pouvez aussi les passer comme paramètres d'entrée de la fonction.

public function scopeFilter($query)
{
    $published = Input::get('published');
    if (isset($published)) $query->where('published', '=', $published);

    return $query;
}

Contrôleur:

Ici, la requête est exécutée par le biais de la filter() avant de retourner à la vue.

public function index()
{
    return View::make('articles.index', [
        'articles' => Article::with('writer')->filter()->get()
    ]);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top