Laravel中Model类直接调用pluck方法的来源问询
嘿,这个问题刚接触Laravel的时候确实容易懵,我当初也琢磨过一阵!让我给你拆解清楚:
首先,你直接在Model类上调用静态方法
pluck()的时候,并不是Model类本身有这个方法,而是Laravel的魔术方法在起作用。Laravel的Illuminate\Database\Eloquent\Model类里有个__callStatic魔术方法,当你调用一个Model上不存在的静态方法时,它会自动创建一个**查询构建器(Eloquent Builder)**实例,然后把这个方法转发给查询构建器来执行。真正的
pluck()方法是定义在查询构建器里的,具体来说是Illuminate\Database\Query\Builder类(Eloquent Builder继承了这个类的所有方法)。这个方法会直接在数据库层面执行类似SELECT id FROM my_models的查询,然后把结果包装成Collection实例返回给你——这也是你能在Collection里找到pluck方法的原因,但要注意:这里Model静态调用的pluck是查询构建器的方法,和Collection的pluck是两个不同的东西(前者直接操作数据库查询,后者在内存里处理已获取的集合数据)。你可以把
App\MyModel::pluck('id')理解成下面这段代码的简写:App\MyModel::query()->pluck('id');其中
query()方法就是Model类提供的,用来获取查询构建器实例的方法。
如果你去翻Illuminate\Database\Eloquent\Model的源码,能找到__callStatic方法的实现,它内部就是调用了$this->newQuery()->$method(...$parameters),也就是创建新的查询构建器然后调用对应的方法~
内容的提问来源于stack exchange,提问作者Zibellon

