2016-07-29 14 views
5

Tôi muốn biết về hiệu quả/hiệu suất của việc sử dụng các câu lệnh có điều kiện mới của Laravel when() có trong các hàm Trình tạo truy vấn.Tuyên bố điều kiện của Laravel: là khi nào() hiệu quả?

Chúng có hiệu quả hơn điều kiện biến đơn giản không?

Ví dụ: tôi đang lọc kết quả với một số đài phát thanh và hộp kiểm tra, và họ sẽ cung cấp nhiều điều kiện, tôi muốn biết cách hiệu quả nhất của việc áp dụng chúng:

đơn giản có điều kiện:

if($request->has('sale')) $query = $query->sale(); 

Laravel Tuyên bố điều kiện:

query->when($request->has('sale'), function ($query){ 
    return $query->sale(); 
}) 

Xin cảm ơn trước, chúc mừng.

Documents: https://laravel.com/docs/5.2/queries#conditional-statements

Trả lời

2

TL; DR: Các when chức năng là ít hơn syntactic sugar. Nó không hiệu quả hơn các điều kiện thông thường, và (có lẽ) không kém hiệu quả, đủ để lo lắng.


Hãy có một cái nhìn tại when method's source code:

public function when($value, $callback) 
{ 
    $builder = $this; 

    if ($value) { 
     $builder = call_user_func($callback, $builder); 
    } 

    return $builder; 
} 

Như bạn có thể thấy, phương pháp when không làm bất cứ điều gì khác biệt so với if (<your conditional>) và sau đó gọi hàm callback được cung cấp bởi bạn.

Vì nó hoàn toàn giống với ví dụ có điều kiện đơn giản của bạn nên không thể hiệu quả hơn. Nó có thể sẽ ít hiệu quả hơn, bởi vì nó liên quan đến hai cuộc gọi phương thức bổ sung - tuy nhiên, điều này sẽ rất nhỏ đến nỗi tôi sẽ không lo lắng về bất kỳ tác động hiệu suất nào. Nếu bạn lo lắng về hiệu quả, bạn nên cấu hình cả hai triển khai và chỉ tối ưu hóa nếu nó chứng tỏ là một nút cổ chai.

Lý do thực sự cho sự tồn tại của hàm whensyntactic sugar. Nó cho phép bạn có điều kiện thêm trở ngại mới cho một truy vấn mà không phá vỡ giao diện thông thạo các 's QueryBuilder:

$q = $q 
    ->when(isset($foo), function() use ($foo) { return $q->where('foo', $foo); }) 
    ->when(isset($bar), function() use ($bar) { return $q->where('bar', $bar); }) 
    ->when(isset($baz), function() use ($baz) { return $q->where('baz', $baz); }); 

Trái ngược với

if (isset($foo)) { 
    $q = $q->where('foo', $foo); 
} 

if (isset($bar)) { 
    // ... 

Trong một số trường hợp điều này có thể chứng minh là có thể đọc được tốt hơn (hay không). Cuối cùng, dù sử dụng when() hoặc một điều kiện đơn giản thay thế, không có gì khác hơn là sở thích cá nhân.

+1

Wow, bây giờ đó là câu trả lời. Cảm ơn bạn rất nhiều. Không biết về 'cú pháp cú pháp'. Nhân tiện, TL, DR nghĩa là gì? tôi đã đăng câu hỏi ở định dạng không đúng? Tôi là người mới ở đây. –

+1

Vui lòng trợ giúp và chào mừng bạn đến với StackOverflow! TL; DR có nghĩa là * quá dài; đã không đọc * và thường được sử dụng làm tiền tố cho một bản tóm tắt ngắn để anwser dài hơn. – helmbert

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