Laravel条件声明:什么时候()有效?

时间:2016-07-29 14:31:19

标签: php performance laravel-5 conditional query-optimization

我想知道使用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

1 个答案:

答案 0 :(得分: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()还是简单的条件,只不过是个人品味。