Truy vấn hiệu quả của Laravel 4 bằng WHERE với OR VÀ OR?


Câu trả lời:


456

Sử dụng Nhóm tham số ( Laravel 4.2 ). Ví dụ của bạn, nó sẽ giống 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);
});

13
Chỉ cần làm function ($query) use ($param1, $param2)...; Oh, bạn đã xóa bình luận của bạn.
rmobis

5
Liên kết chính xác đến tài liệu của Laravel là: laravel.com/docs/queries#advified-where-clauses
dave

93

Nếu bạn muốn sử dụng tham 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);
});

19

nếu bạn muốn sử dụng dấu ngoặc đơn trong laravel 4 và đừng quên quay lại
Trong Laravel 4 (ít nhất), bạn cần sử dụng $ a, $ b trong ngoặc đơn 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);
});

Đây là kết quả của tôi: nhập mô tả hình ảnh ở đây


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

16

Trong trường hợp bạn đang lặp các điều kiện HOẶC, bạn không cần truy vấn $ thứ hai-> từ các bài đăng khác (thực ra tôi không nghĩ rằng bạn cần nói chung, bạn chỉ có thể sử dụng orWhere trong phần lồng nhau nếu dễ 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, doesn't need to be ->where
        $query->orWhere($key,$value);
    }
});

1
Tôi nghĩ bạn sẽ phải thêm usetừ khóa để sử dụng biến thuộc tính bên trong.
Meneer Venus

6

$ a, $ b, $ c, $ d có thể là các giá trị động theo 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);
        })

6

Đơn giản chỉ cần sử dụng trong Laravel Eloquent:

$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 một truy vấn như:

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

5

Một cách khác mà không cần sử dụng Modal

Cơ sở dữ liệu: stock Cột: id, name, company_name, exchange_name, status nhập mô tả hình ảnh ở đây

  $name ='aa'
  $stocks = DB::table('stocks')
            ->select('name', 'company_name', 'exchange_name')
            ->where(function($query) use ($name) {
                $query->where('name', 'like', '%' . $name . '%')
                ->orWhere('company_name', 'like', '%' . $name . '%');
            })
            ->Where('status', '=', 1)
            ->limit(20)
            ->get();

4

Bạn cũng có thể sử dụng phạm vi truy vấn để làm cho mọi thứ gọn gàng hơn một chút, vì vậy bạn có thể làm một cái 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;    
}

4

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

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

Bây giờ áp dụng một điều kiện khác cho $modelbiến đó

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

2
YourModel::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);
});

1

Cách tốt nhất để sử dụng dấu ngoặc vuông sử dụng chức năng gọi lại trong tài liệu hùng biện.

YourModal::where(function ($q) {
    $q->where('a', 1)->orWhere('b', 1);
})->where(function ($q) {
    $q->where('c', 1)->orWhere('d', 1);
});

Bạn không phải sử dụng =biểu tượng, nó là mặc định

Hãy nói rằng nếu bạn có một truy vấn có chứa dấu ngoặc trong ngoặc

WHERE (a = 1 OR (b = 1 and c = 5))


YourModal::where(function ($q) {
    $q->where('a', 1)->orWhere(function($q2){
      $q2->where('b', 1)->where('c', 5);
    });
});

kẻo nói rằng bạn muốn tạo ra giá trị động

YourModal::where(function ($q) use($val1, $val2) {
    $q->where('a', $val1)->orWhere(function($q2) use($val2){
      $q2->where('b', $val2)->where('c', $val2);
    });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.