2013-03-27 18 views
15

Come posso scrivere un tipo di query seguente o simile utilizzando Eloquent?Combinazione di query AND/OR eloquente in Laravel

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

non ho potuto combinare E/O nel modo volevo concatenando dove & funzioni or_where.

risposta

31

È possibile nido dove clausole: 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'); 

Questo dovrebbe produrre: SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

+0

L'istruzione precedente funziona se la parola chiave è essa stessa una stringa. Ma come faccio a usare la parola chiave precedente se è una variabile? – SUB0DH

+3

@ SUB0DH È possibile iniettare la variabile nello scope closures con ** use **. 'function ($ query) use ($ variable)' –

-3

È possibile utilizzare DB::raw() nel primo where() per inserire l'istruzione simile/o.

+0

L'uso di metodi Eloquent è molto meglio di questo. – aowie1

7

Per una risposta più precisa l'esempio:

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

Nota: Questa è laravel 3 sintassi , usa camelCase oWhere() per Laravel 4

+0

In Laravel 4 (almeno) è necessario usare '$ val' tra parentesi come nell'esempio' A_Table_Model :: where (function ($ query) use ($ val) ' –

2

In Laravel 5.1+ questo farà anche il lavoro e apparirà più pulito:

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

Per qualcuno che ha votato per difetto - puoi spiegare cosa c'è di sbagliato in questa soluzione? – Kornel

+1

Non sono stato io a votare, ma comunque: la tua risposta non copre" AND c = 1 AND d = 5 " parte della domanda, quindi la tua risposta è errata –

+0

true. Aggiornato ... – Kornel

Problemi correlati