【问题标题】:Laravel Conditional Statement: is when() efficient?Laravel 条件语句:when() 有效吗?
【发布时间】:2016-12-04 07:44:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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()还是用一个简单的条件来代替,无非是个人喜好。

    【讨论】:

    • 哇,这就是答案。太感谢了。不知道“语法糖”。顺便说一句,TL;DR 是什么意思?我是否以错误的格式发布了问题?我是新来的。
    • 很高兴为您提供帮助,欢迎来到 StackOverflow! TL;DR 表示 太长;没读过,经常被用作长篇文章的简短摘要的前缀。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2022-08-17
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多