2013-01-06 31 views

Trả lời

33

Trong thạo bạn có thể làm:

$query = DB::table('node'); 

if ($published == true) 
    $query->where('published', '=', 1); 

if (isset($year)) 
    $query->where('year', '>', $year); 

$result = $query->get(); 
+0

Cảm ơn người đàn ông này chính là điều tôi muốn biết. Cổ vũ người bạn đời. –

+4

Điều này chỉ trả về một mảng. có cách nào để trả lại bộ sưu tập không? –

+0

tính năng này cũng được thực hiện vào ngày được phân trang, chỉ cần hoán đổi để có được paginate hoặc simplePaginate – Sam

7

Đây là cách bạn có thể thực hiện truy vấn của bạn:

$year = 2012; 
$published = true; 

DB::table('node') 
->where(function($query) use ($published, $year) 
{ 
    if ($published) { 
     $query->where('published', 'true'); 
    } 

    if (!empty($year) && is_numeric($year)) { 
     $query->where('year', '>', $year); 
    } 
}) 
->get(array('column1','column2')); 

Để tìm thêm thông tin, tôi khuyên bạn nên đọc qua thạo và hùng hồn trong các tài liệu Laravel. http://laravel.com/docs/database/fluent

3

Nếu bạn cần phải sử dụng hùng biện, bạn có thể sử dụng nó như thế nào, tôi không chắc chắn rằng whereNotNull là việc sử dụng tốt nhất nhưng tôi không thể tìm thấy một phương pháp khác để trả lại những gì chúng ta thực sự muốn trở thành một ví dụ truy vấn rỗng:

$query = Model::whereNotNull('someColumn'); 
if(x < y) 
    { 
     $query->where('column1', 'LIKE', '%'. $a .'%'); 
    }else{ 
     $query->where('column2', 'LIKE', '%'. $b .'%'); 
    } 
$results = $query->get(); 

Bằng cách này bất kỳ mối quan hệ vẫn làm việc, ví dụ theo quan điểm của bạn, bạn vẫn có thể sử dụng

foreach($results as $result){ 
    echo $result->someRelationship()->someValue; 
} 

Có một số lượng thông tin tốt ở đây http://daylerees.com/codebright/eloquent-queries về loại nội dung này.

3

Tính đến Laravel 5.2.27, bạn có thể tránh phá vỡ chuỗi bằng cách viết điều kiện của bạn như vậy:

$query = DB::table('node') 
    ->when($published, function ($q) use ($published) { 
     return $q->where('published', 1); 
    }) 
    ->when($year, function($q) use ($year) { 
     return $q->where('year', '>', $year); 
    }) 
    ->get(); 

Để sử dụng hùng hồn, chỉ trao đổi $query = DB::table('node') với Node:: nhưng nhận ra nếu cả hai điều kiện thất bại, bạn sẽ nhận được tất cả mọi thứ trong bảng trở lại trừ khi bạn kiểm tra một số điều kiện khác trước khi truy vấn db/mô hình hoặc từ bên trong chính truy vấn đó.

Lưu ý rằng $published$year phải nằm trong phạm vi địa phương để sử dụng khi đóng.

Bạn có thể làm cho nó ngắn gọn hơn và dễ đọc hơn bằng cách tạo macro. Xem: Conditionally adding instructions to Laravel's query builder

0

cho truy vấn hùng hồn tôi được sử dụng sau đó thực hiện chỉ khi nào có điều kiện có giá trị

->where(function($query) use ($value_id) 
        { 

          if (! is_null($value_id)) 
           $query->where('vehicle_details.transport_type_id', $value_id); 

        }) 
0

Bạn có thể sử dụng Model::when() trong Điều kiện hoặc bạn có thể tạo Builder::micro()

Ví dụ

$results = Model::where('user_id', Auth::id()) 
    ->when($request->customer_id, function($query) use ($request){ 
     return $query->where('customer_id', $request->customer_id); 
    }) 
    ->get(); 

Nếu bạn cần tạo vi điều kiện. làm theo hướng dẫn dưới đây.

Viết mã thic trong cung cấp dịch vụ serverice bạn

Builder::macro('if', function ($condition, $column, $operator, $value) { 
    if ($condition) { 
     return $this->where($column, $operator, $value); 
    } 

    return $this; 
}); 

Sử dụng như dưới đây Ví dụ

$results = Model::where('user_id', Auth::id()) 
    ->if($request->customer_id, 'customer_id', '=', $request->customer_id) 
    ->get(); 

Ref: themsaid

Các vấn đề liên quan