雄辩第一个where子句

时间:2015-10-19 10:03:44

标签: php laravel

我想知道Laravel如何实现雄辩的语法,以便可以使用User::where()静态调用第一个where子句

User::where('id', 23)->where('email', $email)->first();

他们是否有public static function where()public function where()

2 个答案:

答案 0 :(得分:6)

在Eloquent模型上调用where确实会在幕后产生一些魔力。首先,举例:

User::where(’name’, ‘Joe’)->first;

where类扩展的Model类上没有静态User方法。

会发生什么,调用PHP魔术方法__callStatic,然后尝试调用where方法。

public static function __callStatic($method, $parameters)
{
    $instance = new static;

    return call_user_func_array([$instance, $method], $parameters);
}

由于没有明确定义的用户函数where,因此执行__call中定义的下一个神奇的PHP方法Model

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return call_user_func_array([$this, $method], $parameters);
    }

    $query = $this->newQuery();

    return call_user_func_array([$query, $method], $parameters);
}

可通过以下方式访问与公共数据库相关的方法:

$query = $this->newQuery();

这会实例化一个新的Eloquent查询构建器对象,并且在此对象上运行where方法。

所以,当你使用```User :: where()``你实际上正在使用:

Illuminate\Database\Eloquent\Builder::where()

查看Builder class,了解您习惯使用的所有常用Eloquent方法,例如where()get()first(),{{1等等。

Laracasts有一个非常深入(付费)的视频,讲述了Eloquent幕后工作的原因,我推荐。

答案 1 :(得分:1)

好吧,让我们找出来。

当我们打开一个模型时,它会扩展Model所以让我们打开那个类。 在课程Model中,我们找到了2个名为__call()__callStatic()

的“神奇”方法 在对象上下文中调用不可访问的方法时会触发

__call()

在静态上下文中调用不可访问的方法时会触发

__callStatic()

我们在课程Model中也看到它使用了课程use Illuminate\Database\Query\Builder as QueryBuilder;

如果我们打开Builder课程,我们会找到一个名为public function where()

的方法

因此,如果您致电User::where,则会从__callStatic('where', $parameters)班级拨打Model

我希望这是有道理的。