美文网首页Laravel Steps
Laravel Model 工作原理研究

Laravel Model 工作原理研究

作者: AnnaJIAN | 来源:发表于2018-11-02 13:24 被阅读0次

简单研究一下表单查询数据是如何实现的。

跟踪这段代码。

$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

相关文章

网友评论

    本文标题:Laravel Model 工作原理研究

    本文链接:https://www.haomeiwen.com/subject/agnqxqtx.html