2013-06-08 10 views

Odpowiedz

288

Skorzystaj z Parameter Grouping (Laravel 4.2). Na swoim przykładzie, że to będzie coś takiego:

Model::where(function ($query) { 
    $query->where('a', '=', 1) 
      ->orWhere('b', '=', 1); 
})->where(function ($query) { 
    $query->where('c', '=', 1) 
      ->orWhere('d', '=', 1); 
}); 
+11

Tylko nie 'function ($ query) wykorzystanie ($ param1, $ param2) ...' ; Och, usunąłeś swój komentarz. – rmobis

+0

Poprawny link do Laravel doco to: http://laravel.com/docs/queries#advanced-where-clauses – dave

59

Jeśli chcesz użyć parametrów a, b, c, d w laravel 4

Model::where(function ($query) use ($a,$b) { 
    $query->where('a', '=', $a) 
      ->orWhere('b', '=', $b); 
}) 
->where(function ($query) use ($c,$d) { 
    $query->where('c', '=', $c) 
      ->orWhere('d', '=', $d); 
}); 
10

Incase jesteś zapętlenie OR warunki, nie trzeba się drugi $ query-> gdzie od innych stanowisk (w rzeczywistości nie sądzę, trzeba w ogóle, można po prostu użyć orWhere w zagnieżdżony gdzie jeśli łatwiej)

$attributes = ['first'=>'a','second'=>'b']; 

$query->where(function ($query) use ($attributes) 
{ 
    foreach ($attributes as $key=>value) 
    { 
     //you can use orWhere the first time, dosn't need to be ->where 
     $query->orWhere($key,$value); 
    } 
}); 
+1

Myślę, że będziesz musiał dodać słowo kluczowe "use", aby użyć zmiennej atrybutów wewnątrz miejsca. –

2

Możesz również użyć zakresów kwerend, aby zrobić rzeczy nieco porządniej, więc można zrobić coś takiego:

Invoice::where('account', 27)->notPaidAt($date)->get(); 

potem w modelu

public function scopeNotPaidAt($query, $asAt) 
{ 
    $query = $query->where(function ($query) use ($asAt) { 
     $query->where('paid', '=', '0000-00-00')->orWhere('paid', '>=', $asAt); 
    }); 
    return $query;  
} 
3

Można również zapytać pierwszego lub warunku, a później można zastosować inny albo stan

$model = Model::where('a',1)->orWhere('b',1); 

zastosuj teraz inny warunek dla tej zmiennej $model

$model1 = $model->where('c',1)->orWhere('d',1)->get(); 
10

jeśli chcesz używać nawiasów w laravel 4 i nie zapomnij wrócić
W laravel 4 (co najmniej) trzeba użyć $ a, $ b w nawiasach, jak w przykładzie

$a = 1; 
$b = 1; 
$c = 1; 
$d = 1; 
Model::where(function ($query) use ($a, $b) { 
    return $query->where('a', '=', $a) 
      ->orWhere('b', '=', $b); 
})->where(function ($query) use ($c, $d) { 
    return $query->where('c', '=', $c) 
      ->orWhere('d', '=', $d); 
}); 

ten jest mój wynik: enter image description here

+0

Dziękuję za wzmiankę o używaniu ($ a, $ b) – mentorgashi

2

$ a, $ b, $ c $ d mogą być dynamiczne wartości w zapytaniu

->where(function($query) use ($a, $b) 
     { 
      $query->where('a', $a) 
        ->orWhere('b',$b); 
     }) 
->where(function($query) use ($c, $d) 
     { 
      $query->where('c', $c) 
        ->orWhere('d',$d); 
     }) 
0

prostu użyć w laravel wymowny:

$a='foo', $b='bar', $c='john', $d='doe'; 

Coder::where(function ($query) use ($a, $b) { 
    $query->where('a', '=', $a) 
      ->orWhere('b', '=', $b); 
})->where(function ($query) use ($c, $d) { 
    $query->where('c', '=', $c) 
      ->orWhere('d', '=', $d); 
})->get(); 

będzie produkować zapytania jak:

SELECT * FROM <table> WHERE (a='foo' or b='bar') AND (c='john' or d='doe'); 
Powiązane problemy