[英]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.