繁体   English   中英

雄辩第一个where子句

[英]Eloquent the first where clause

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

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

他们有一个public static function where()和一个public function where()

调用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 ,因此执行Model定义的下一个神奇的PHP方法__call

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类 ,看看你习惯使用的所有常用Eloquent方法,比如where()get()first()update()等。

Laracasts有一个非常深入(付费)的视频,讲述了Eloquent在幕后的工作方式,我建议这样做。

好吧,让我们找出答案。

当我们打开一个模型时,它扩展了Model所以让我们打开那个类。 在类Model我们找到了2个名为__call()__callStatic() “魔法”方法

在对象上下文中调用不可访问的方法时会触发__call()

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

我们还在类Model看到它使用类use Illuminate\\Database\\Query\\Builder as QueryBuilder;

如果我们打开Builder类,我们找到一个名为public function where()的方法public function where()

因此,如果您调用User::where它从Model类调用__callStatic('where', $parameters)

我希望这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM