简单研究一下表单查询数据是如何实现的。
跟踪这段代码。
$posts = Post::latest()
->filter(request(['month', 'year']))
->get();
调试代码
public function latest($column = 'created_at')
{
$e = new \Exception;
print_r($e->getTraceAsString());
return $this->orderBy($column, 'desc');
}
结论:
通过php反射类, 实例化Post model,new Post()
Post 里面没有lastest(), 但是post 继承了Illuminate\Database\Eloquent\Model;
Illuminate\Database\Eloquent\Model.php
public static function __callStatic($method, $parameters)
{
return (new static)->$method(...$parameters);
}
Illuminate\Database\Eloquent\Model.php
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
return $this->newQuery()->$method(...$parameters);
}
newQuery()找到Eloquent\Builder然后Query\Builder
@return \Illuminate\Database\Eloquent\Builder
@return \Illuminate\Database\Query\Builder
在Query\Builder找到latest()
public function latest($column = 'created_at')
{
return $this->orderBy($column, 'desc');
}
Eloquent\Builder 是对 Query\Builder 的进一步封装,以便更好的实现关系对象查询。
中间过程太复杂,以后再慢慢读。
Tips
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
网友评论