Laravel条件语句:当()有效


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-语句

TL;DR:when函数只不过是句法糖。它并不比常规条件句更有效率,而且(可能)效率也不低到令人担忧的程度。


让我们来看看when方法的源代码:

public function when($value, $callback)
{
    $builder = $this;
    if ($value) {
        $builder = call_user_func($callback, $builder);
    }
    return $builder;
}

正如您所看到的,when方法与if (<your conditional>)然后调用您提供的回调函数没有任何不同。

因为它与您的简单条件示例完全相同,所以它的效率再高不过了。它可能会稍微降低效率,因为它涉及两个额外的方法调用——然而,这将是非常微不足道的,我不会担心任何性能影响。如果您关心效率,您应该对这两种实现进行评测,并且只有在它被证明是一个瓶颈时才进行优化。

when函数存在的真正原因是句法糖。它允许您有条件地向查询添加新的约束,而不会破坏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()还是使用简单的条件,只不过是个人品味。