How to say WHERE (a=1 OR b=1) AND (c=1 OR d=1)
Laravel 4 eloquent WHERE with OR OR OR?
Dla bardziej skomplikowanych zapytań mam używać surowego SQL?
How to say WHERE (a=1 OR b=1) AND (c=1 OR d=1)
Laravel 4 eloquent WHERE with OR OR OR?
Dla bardziej skomplikowanych zapytań mam używać surowego SQL?
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);
});
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);
});
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);
}
});
Myślę, że będziesz musiał dodać słowo kluczowe "use", aby użyć zmiennej atrybutów wewnątrz miejsca. –
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;
}
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();
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);
});
Dziękuję za wzmiankę o używaniu ($ a, $ b) – mentorgashi
$ 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);
})
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');
Tylko nie 'function ($ query) wykorzystanie ($ param1, $ param2) ...' ; Och, usunąłeś swój komentarz. – rmobis
Poprawny link do Laravel doco to: http://laravel.com/docs/queries#advanced-where-clauses – dave