2013-03-27 12 views
15

Wie kann ich folgende oder ähnliche Art von Abfragen mit Eloquent schreiben?Kombinieren UND/oder eloquente Abfrage in Laravel

SELECT * FROM a_table WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1 AND d = 5

Ich konnte nicht kombinieren und/oder in der Art, wie ich durch Verkettungs wo & or_where Funktionen wollten.

Antwort

31

Sie können Nest where-Klauseln: http://laravel.com/docs/database/fluent#nested-where

Model::where(function($query) 
{ 
    $query->where('a', 'like', 'keyword'); 
    $query->or_where('b', 'like', 'keyword'); 
}) 
->where('c', '=', '1'); 

Diese produzieren sollte: SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

+0

Die obige Anweisung funktioniert, wenn das Schlüsselwort selbst eine Zeichenfolge ist. Aber wie verwende ich das Obige, wenn das Schlüsselwort eine Variable ist? – SUB0DH

+3

@ SUB0DH Sie können die Variable mit ** usage ** in den Bereich Verschlüsse injizieren. 'function ($ query) use ($ variable)' –

-3

Sie können DB::raw() in der ersten where() verwenden, um die Like/oder Anweisung zu setzen.

+0

Mit eingebauten Eloquent Methoden ist viel besser als das. – aowie1

7

Für eine genauere Antwort auf das Beispiel:

$val = '%keyword%'; 

A_Table_Model::where(function($query) use ($val) 
{ 
    $query->where('a', 'like', $val); 
    $query->or_where('b', 'like', $val); 
}) 
->where('c', '=', 1) 
->where('d', '=', 5) 
->get(); 

Hinweis: Dies ist Laravel 3 Syntax Verwenden Sie camelCase oderWhere() für Laravel 4

+0

In Laravel 4 (mindestens) müssen Sie '$ val' in Klammern verwenden wie im Beispiel' A_Table_Model :: where (function ($ query) use ($ val) ' –

2

In Laravel 5.1+ wird dies auch die Arbeit tun und sieht sauberer aus:

Model::where(function($query) { 
    $query->where('a', 'like', 'keyword'); 
    $query->or_where('b', 'like', 'keyword'); 
})->where('c', '=', '1')->get(); 
+0

An jemanden, der dies abgelehnt hat - können Sie erklären, was mit dieser Lösung falsch ist? – Kornel

+1

Es war nicht ich, der abgestimmt hat, aber trotzdem: Ihre Antwort deckt nicht" UND c = 1 UND d = 5 " Teil der Frage, also ist deine Antwort falsch. –

+0

true. Aktualisiert ... – Kornel

Verwandte Themen