动机
首先来说一个Eloquent ORM的设计思想:Eloquent ORM就是将数据库中复杂的数据结果封装成更加smart的接口提供给用户使用。数据库中每一个表对应一个类,而类的实例对应数据库表中的一行记录,数据库中的列值会对应到类的属性上。一直在使用这个东西,之前并没有深入去了解过,借这个机会查阅了Laravel底层的源码。
笔者的环境:Laravel5.5, Sublime编辑器(强烈建议按转代码提示插件)。
模型类的创建
先创建一个简单的例子用来跟踪底层的代码,Controller与Model对应如下:
namespace App\Http\Controllers;
use App\Article;
class ArticleController extends Controller
{
public function index()
{
dd(Article::all());
}
}
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
}
注意:路由就不出来了。
模型类的实现原理
新创建的类什么都没有做,却可以实现对数据库的相关操作,关键点就是它继承了Illuminate\Database\Eloquent\Model。分阶段介绍:第一阶段是Eloquent ORM查询构造器的生成,第二阶段是数据库操作方法的执行。
Eloquent ORM查询构造器的生成
英文不好有些地方借助了翻译软件加上自己的理解些的注释
文件 \Illuminate\Database\Eloquent\Model.php;
/**
* Get all of the models from the database.
*
* @param array|mixed $columns
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
//从数据库表中获取所有模型
public static function all($columns = ['*'])
{
return (new static)->newQuery()->get(
is_array($columns) ? $columns : func_get_args()
);
}
/**
* Create a new Eloquent model instance.
*
* @param array $attributes
* @