2013-03-27 4 views
15

Jak mogę napisać następujące lub podobne rodzaje zapytań używając Eloquent?Łączenie AND/LUB eloquent query w Laravel

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

nie mogłem połączyć i/lub w drodze chciałem przez łańcuchowym miarę & funkcje or_where.

Odpowiedz

31

Można gniazdo gdzie klauzul: 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'); 

ta powinna dawać: SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

+0

Powyższa instrukcja działa, jeśli słowo kluczowe samo w sobie jest ciągiem. Ale w jaki sposób mogę wykorzystać powyższe, jeśli słowo kluczowe jest zmienną? – SUB0DH

+3

@ SUB0DH Możesz wstawić zmienną do zakresu zamknięć przy ** użyciu **. 'function ($ query) use ($ variable)' –

-3

Możesz użyć DB::raw() w pierwszym where(), aby wstawić instrukcję podobną/lub.

+0

Korzystanie z wbudowanych metod Eloquent jest znacznie lepsze. – aowie1

7

Dla dokładniejszej odpowiedzi na przykład:

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

Uwaga: To jest laravel 3 składnia , użyj camelCase lubWhere() dla Laravel 4

+0

W Laravel 4 (przynajmniej) musisz użyć '$ val' w nawiasach, jak w przykładzie' A_Table_Model :: where (funkcja ($ query) use ($ val) ' –

2

W Laravel 5.1+ to również wykona zadanie i wygląda na czystsze:

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

Do kogoś, kto nie głosował na to - czy możesz wyjaśnić, co jest nie tak z tym rozwiązaniem? – Kornel

+1

To nie ja głosowałem, ale tak czy inaczej: twoja odpowiedź nie obejmuje" AND c = 1 AND d = 5 " część pytania, więc twoja odpowiedź jest błędna –

+0

prawda. Zaktualizowane ... – Kornel