我想知道Laravel如何实现雄辩的语法,以便可以使用User::where()
静态调用第一个where子句
User::where('id', 23)->where('email', $email)->first();
他们是否有public static function where()
和public function where()
答案 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
。
我希望这是有道理的。