2016-07-29 74 views
5

我想知道在查詢生成器函數中使用Laravel的新條件語句when()的效率/性能。Laravel條件聲明:是何時()有效?

它們比簡單的變量條件更有效嗎?

例子:我正在篩選結果與一些無線電和複選框,它們會提供很多條件語句,我想知道它們應用的最有效的方法:

簡單的條件:

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

Laravel條件聲明:

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

在此先感謝,歡呼聲。

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

回答

2

TL; DR:when功能是少許超過syntactic sugar。它並不比常規條件更有效,並且(可能)效率不足以擔心。


讓我們來看看when method's source code

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

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

    return $builder; 
} 

正如你所看到的,when方法不會做任何事情比if (<your conditional>)不同,然後調用由您提供的回調函數。

因爲它的確和你簡單的條件例子完全一樣,所以它不可能是更有效的。它的效率可能稍微低一些,因爲它涉及到兩個額外的方法調用 - 但是,這會很微不足道,我不會擔心任何性能影響。如果您擔心效率問題,則應該分析兩種實施方案,只有在證明是瓶頸時才進行優化。

when函數存在的真正原因是syntactic sugar。它允許你有條件地添加新的約束來查詢,而打破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); }); 

與之相對

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

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

在某些情況下,這可能被證明是更好的可讀性(或不)。最後,無論是使用when()還是簡單的條件代替,無非就是個人品味。

+1

哇,現在這是一個答案。非常感謝。不知道'語法糖'。順便說一下,TL,DR是什麼意思?我是否以不良格式發佈了問題?我在這裏有點新鮮感。 –

+1

樂於幫忙,歡迎來到StackOverflow! TL; DR意味着*太長;沒有閱讀*,並且經常用作前綴以作爲較長的縮略圖的簡短摘要。 – helmbert