2013-06-08 53 views

Trả lời

288

Sử dụng Parameter Grouping (Laravel 4.2). Ví dụ của bạn, nó muốn được một cái gì đó như thế này:

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

Chỉ cần 'function ($ query) sử dụng ($ param1, param2 $) ... ' ; Ồ, bạn đã xóa nhận xét của mình. – rmobis

+0

Liên kết chính xác với Laravel doco là: http://laravel.com/docs/queries#advanced-where-clauses – dave

59

Nếu bạn muốn sử dụng các thông số cho a, b, c, d trong 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

Trong trường hợp bạn đang looping OR điều kiện, bạn không cần các $ thứ hai query-> nơi từ các bài viết khác (thực sự tôi không nghĩ rằng bạn cần nói chung, bạn chỉ có thể sử dụng orWhere trong lồng nhau mà nếu dễ dàng hơn)

$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

Tôi nghĩ bạn sẽ phải thêm từ khóa 'use' để sử dụng biến thuộc tính bên trong vị trí đó. –

2

Bạn cũng có thể sử dụng phạm vi truy vấn để làm mọi thứ chút ngăn nắp, vì vậy bạn có thể làm điều gì đó như:

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

Sau đó, trong mô hình của bạn

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

Bạn cũng có thể truy vấn đầu tiên hay điều kiện và sau đó bạn có thể áp dụng một hoặc điều kiện

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

hiện áp dụng một điều kiện khác trên đó $model biến

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

nếu bạn muốn sử dụng dấu ngoặc đơn trong laravel 4 và đừng quên quay trở lại
Trong Laravel 4 (ít nhất), bạn cần phải sử dụng $ a, $ b trong ngoặc như trong ví dụ

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

này là kết quả của tôi: enter image description here

+0

Cảm ơn bạn đã đề cập đến việc sử dụng ($ a, $ b) – mentorgashi

2

$ a, $ b, $ c, $ d có thể giá trị năng động bằng cách truy vấn

->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

Đơn giản chỉ cần sử dụng trong Laravel hùng biện:

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

Sẽ tạo ra một truy vấn như:

SELECT * FROM <table> WHERE (a='foo' or b='bar') AND (c='john' or d='doe'); 
Các vấn đề liên quan