2016-07-29 31 views
5

Ich möchte über die Effizienz/Leistung von Laravel neue Conditional Statements when() wissen, die in den Query Builder-Funktionen kommt.Laravel Conditional Statement: Ist wann() effizient?

Sind sie effizienter als eine einfache variable Bedingung?

Beispiel: Ich bin Filterung Ergebnisse mit einigen Radio- und Checkboxen, und sie werden viele conditionals bieten, würde Ich mag die effizienteste Art und Weise der Anwendung von ihnen wissen:

Einfache Bedingung:

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

Laravel Bedingte Anweisung:

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

Vielen Dank im Voraus, cheers.

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

Antwort

2

TL; DR: Die when Funktion ist wenig mehr als syntactic sugar. Es ist nicht effizienter als normale Bedingungen und (wahrscheinlich) nicht weniger effizient genug, um sich Sorgen zu machen.


Schauen wir uns die when method's source code einen Blick:

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

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

    return $builder; 
} 

Wie Sie die when Methode macht nichts anders sehen, als if (<your conditional>) und dann die Callback-Funktion von Ihnen gelieferten Aufruf.

Weil es genauso wie Ihr einfaches bedingtes Beispiel funktioniert, kann es nicht mehr effizient sein. Es wird wahrscheinlich marginal weniger effizient sein, da es zwei zusätzliche Methodenaufrufe erfordert - dies wird jedoch so marginal sein, dass ich mich über keine Auswirkungen auf die Performance Gedanken machen würde. Wenn Sie sich Gedanken über Effizienz machen, sollten Sie beide Implementierungen profilieren und nur optimieren, wenn sich dies als Engpass erweist.

Der eigentliche Grund für die Existenz der when-Funktion ist syntactic sugar. Es ermöglicht Ihnen, bedingt neue Zwänge zu einer Abfrage hinzufügen, ohne die QueryBuilder ‚s Fluent Interface zu brechen:

$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); }); 

Als

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

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

Unter bestimmten Umständen zu

Gegensatz dies besser lesbar erweisen könnte (oder auch nicht). Am Ende, ob when() oder eine einfache bedingte stattdessen verwenden, ist nichts mehr als persönlicher Geschmack.

+1

Wow, das ist jetzt eine Antwort. Ich danke dir sehr. Wusste nicht über "syntaktischen Zucker". Übrigens, was bedeutet TL, DR? habe ich die Frage in einem schlechten Format gepostet? Ich bin irgendwie neu hier. –

+1

Wir freuen uns, Ihnen zu helfen und willkommen bei StackOverflow! TL; DR bedeutet * zu lang; hat * nicht gelesen und wird oft als Präfix für eine kurze Zusammenfassung zu einem längeren Antwortzeitpunkt verwendet. – helmbert