2016-07-29 28 views
5

クエリビルダーの関数であるLaravelの新しい条件文when()を使用することの効率/パフォーマンスについて知りたいと思います。Laravel条件文:when()は効率的ですか?

単純な可変条件より効率的ですか?

例:私はいくつかのラジオやチェックボックスで結果をフィルタリングしています、そして、彼らは多くの条件文を提供します、私はそれらを適用する最も効率的な方法を知りたいのですが:

簡単な条件:

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

条件文:

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

おかげさまで、ありがとうございました。

ドキュメント:

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

答えて

2

TL; DRは:whensyntactic 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>)とは異なる何かをして、あなたから供給されるコールバック関数を呼び出していません。

単純な条件付きの例とまったく同じであるため、より効率的です。効率的です。おそらく、2つの追加のメソッド呼び出しを必要とするため、おそらくほんの僅かしか効率が悪くなりますが、パフォーマンスの面での影響は心配しません。効率性が懸念される場合は、両方の実装をプロファイルし、ボトルネックであることが判明した場合にのみ最適化する必要があります。

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は*が長すぎることを意味します。 *を読んでいないし、長いanwserへの短い要約の接頭辞としてよく使われます。 – helmbert

関連する問題