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

Man*_*zar 5 php performance conditional query-optimization laravel-5

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

它们比简单的可变条件更有效吗?

示例:我正在使用一些无线电和复选框过滤结果,并且它们将提供许多条件,我想知道应用它们的最有效方法:

简单条件:

if($request->has('sale')) $query = $query->sale();
Run Code Online (Sandbox Code Playgroud)

Laravel条件声明:

 query->when($request->has('sale'), function ($query){
     return $query->sale();
 })
Run Code Online (Sandbox Code Playgroud)

在此先感谢,欢呼.

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

hel*_*ert 3

TL;DR:when功能只不过是语法糖而已。它并不比常规条件语句更有效,而且(可能)效率也没有低到值得担心的程度。


我们来看看该when方法的源代码

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

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

    return $builder;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该方法与调用您提供的回调函数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); });
Run Code Online (Sandbox Code Playgroud)

相对于

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

if (isset($bar)) {
    // ...
Run Code Online (Sandbox Code Playgroud)

在某些情况下,这可能被证明更具可读性(或不可读)。到底是用when()还是简单的条件代替,无非就是个人喜好了。