首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Laravel源码解析之Eloquent Model

上篇文章我们讲了Database的

查询构建器Query Builder

, 学习了Query Builder为构建生成SQL语句而提供的Fluent Api的代码实现。这篇文章我们来学习Laravel Database地另外一个重要的部分: Eloquent Model。

Eloquent Model把数据表的属性、关联关系等抽象到了每个Model类中,所以Model类是对数据表的抽象,而Model对象则是对表中单条记录的抽象。Eloquent Model以上文讲到的Query Builder为基础提供了Eloquent Builder与数据库进行交互,此外还提供了模型关联优雅地解决了多个数据表之间的关联关系。

加载Eloquent Builder

Eloquent Builder是在上文说到的Query Builder的基础上实现的,我们还是通过具体的例子来看,上文用到的:

把它改写为使用Model的方式后就变成了

在Model类文件里我们并没有找到 、 、 这些常用的查询方法,我们都知道当调用一个不存在的类方法时PHP会触发魔术方法 , 调用不存在的实例方法会触发 , 很容易就猜到上面这些方法就是通过这两个魔术方法来动态调用的,下面让我们看一下源码。

Model查询

通过上面的那些代码我们可以看到对Model调用的这些查询相关的方法最后都会通过 转而去调用Eloquent Builder实例的这些方法,Eloquent Builder与底层数据库交互的部分都是依赖Query Builder来实现的,我们看到在实例化Eloquent Builder的时候把数据库连接的QueryBuilder对象传给了它的构造方法, 下面就去看一下Eloquent Builder的源码。

代码里Eloquent Builder的where方法在接到调用请求后直接把请求转给来Query Builder的 方法,然后get方法也是先通过Query Builder的 方法执行查询拿到结果数组后再通过 方法把结果数组转换成Model对象构成的集合,而另外一个比较常用的方法 也是在 方法的基础上实现的,对query应用limit 1,再从 方法返回的集合中用 取出model对象返回给调用者。

Model更新

看完了Model查询的实现我们再来看一下update、create和delete的实现,还是从一开始的查询例子继续扩展:

现在通过Model查询我们获取里一个User Model的实例,我们现在要把这个用户的age改成28岁:

我们知道model的属性对应的是数据表的字段,在上面get方法返回Model实例集合时我们看到过把数据记录的字段和字段值都赋值给了Model实例的$attributes属性, Model实例访问和设置这些字段对应的属性时是通过 和 魔术方法动态获取和设置这些属性值的。

如果Model定义的属性修改器那么在设置属性的时候会去执行修改器,在我们的例子中并没有用到属性修改器。当执行 时, User Model实例里$attributes属性会变成

设置好属性新的值之后执行Eloquent Model的save方法就会更新数据库里对应的记录,下面我们看看save方法里的逻辑:

在save里会根据Model实例的 属性来判断是执行update还是insert, 这里我们用的这个例子是update,在update时程序通过比对 和 两个array属性里各字段的字段值找被更改的字段(获取Model对象时会把数据表字段会保存在 和 两个属性),如果没有被更改的字段那么update到这里就结束了,有更改那么就继续去执行 方法, 方法会执行Eloquent Builder的update方法, 而Eloquent Builder依赖的还是数据库连接的Query Builder实例去最后执行的数据库update。

Model写入

刚才说通过Eloquent Model获取模型时(在 方法里)会把Model实例的 属性设置为true,那么对于新建的Model实例这个属性的值是false,在执行 方法时就会去执行 方法

里如果表是主键自增的,那么在insert后会设置新记录主键ID的值到Model实例的属性里,同时还会帮我们维护时间字段和 属性。

Model删除

Eloquent Model的delete操作也是一样, 通过Eloquent Builder去执行数据库连接的Query Builder里的delete方法删除数据库记录:

Query Builder的实现细节我们在上一篇文章里已经说过了这里不再赘述,如果好奇Query Builder是怎么执行SQL操作的可以回去翻看上一篇文章。

总结

本文我们详细地看了Eloquent Model是怎么执行CRUD的,就像开头说的Eloquent Model通过Eloquent Builder来完成数据库操作,而Eloquent Builder是在Query Builder的基础上做了进一步封装, Eloquent Builder会把这些CRUD方法的调用转给Query Builder里对应的方法来完成操作,所以在Query Builder里能使用的方法到Eloquent Model中同样都能使用。

除了对数据表、基本的CRUD的抽象外,模型另外的一个重要的特点是模型关联,它帮助我们优雅的解决了数据表间的关联关系。我们在之后的文章再来详细看模型关联部分的实现。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190107G1GQ7W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券