Laravel 条件语句:when() 是否有效?

Laravel Conditional Statement: is when() efficient?

我想了解使用查询生成器函数中 Laravel 的新条件语句 when() 的效率/性能。

它们是否比简单的变量条件更有效?

示例:我正在使用一些单选框和复选框过滤结果,它们会提供很多条件,我想知道应用它们的最有效方法:

简单条件:

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

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()还是简单的条件代替,无非是个人口味。