Laravel 中如何区别 Model 或者是 Builder?

Laravel 中如何区别 Model 或者是 Builder?

User::where('id',1)->update([])  和  User::find(1)->update([]) 有异曲同工之效.

 

额?

当你通过 Laravel 与数据库交互时,你可能时而用 Eloquent,时而用更接近于 SQL 原生的查询构造器。

Eloquent 其实就是对查询构造器的对象化包装。就像是给查询器外面包了一层语法糖 

 

底层机制.

一般情况下,所有关于查询构造器的内容都可以在这个命名空间下找到: Illuminate\Database\Query\Builder

而所有关于 Eloquent 的内容都会放在这个命名空间下:
 Illuminate\Database\Eloquent\Model

 

深入 Eloquent

 Laravel 中如何区别 Model 或者是 Builder?

 

Eloquent 也是由很多部分组成的,最具有魅力的部分莫过于 Model 类、它自身用的查询构造器,还有一些比较重要的类,像模型关联等。

举个栗子,我们现在就来具体剖析一下两种查询语句

User::where('id',1) : 这条语句是从一个 eloquent 模型开始,当调用 where () 函数时会返回 eloquent 构造器的实例,也就是说你后面还可以继续调用很多查询方法。注意:Eloquent 构造器是继承自查询构造器的

User::find(1) : 这条语句会直接返回主键为1的数据的对象。注意:如果是同时查询多条数据记录,就会返回一个 eloquent 集合,比如:find([1,2,3])

所以第一种用 where () 方法的查询语句会返回 eloquent 构造器的实例,也就是说我们可以在此基础上继续调用其他的查询方法,而且除了 eloquent 构造器的方法外,还可以调用查询构造器的方法,比如  join 方法。

而对于第二个查询语句,因为返回的是对象,我们既可以直接使用对象的属性,也可以继续调用其他查询方法。

注意:构造器和 eloquent 有一些共同的方法。

Eloquent 会首先去调用自身的方法,如果找不到,就会去调用查询构造器的方法。这种机制有点像继承时子类对方法的重写(译者注:正如前面提到的,eloquent 构造器就是继承于查询构造器的)。这里是通过魔术方法 __call 实现的 https://github.com/laravel/framework/blob/5.7/src/Illuminate/Database/Eloquent/Model.php#L1602.

update 方法就是这样一个二者都有的方法。

然而,虽然同是 update 方法,执行过程还是有很多不同的,比如使用 eloquent 更新数据的时候,如果数据不存在,会返回 false, 而且有一些可选参数,比如开发者可以选择是否设置时间戳。

 

为什么要了解这些?

并不是说你一定要这样做,但是在某些情况下,你可能会需要重写 update 方法。比如前面提到的这条语句User::find(1)->update([...]), 由于 User::find(1) 返回的是对象,在对象上直接调用 update 方法,就会执行你重写的方法。

但是,如果返回的不是对象,而是构造器 (builder),那么你写的方法就不会被执行了,这种情况会默认执行构造器的方法。

我们当然都希望可以通过其他途径解决所遇到的问题,而不是重写方法。

而我写这篇文章的目的就是想强调 “知其所以然” 的重要性

转载:https://learnku.com/laravel/t/25801

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112323.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pycharm怎么导入数据库_pycharm导入python

    pycharm怎么导入数据库_pycharm导入python记录一下自己最近一段时间可能用不上的代码,免得以后再找起来麻烦。pycharm连接数据库首先在找到Database,选择连接自己下载的数据库软件。填写完自己的数据库密码后,如果正确的话,就会出现下面这张图。点下“刷新”按钮后即可连接数据库。测试是否连接成功。到这里基本完成了外部数据导入步骤。2.代码importpymysqlimportmath#用来操作数据库的类classclimb_test_DataInput(object):#…

  • JavaScript正则表达式的两种写法[通俗易懂]

    JavaScript正则表达式的两种写法[通俗易懂]JavaScript正则表达式可以使用正则表达式的特殊符号(//)来声明,也可以采用正则表达式对象(RegExp)来声明。1、使用正则表达式符号正则表达式符号为”//”,即为2个斜杠,中间为匹配规则。JavaScript中类似的特殊符号还有数组“[]”,对象“{}”。示例:      functionprintln(str){         document

  • 分部类(Partial Classes)

    分部类(Partial Classes)

  • Java:JVM垃圾回收机制[通俗易懂]

    Java:JVM垃圾回收机制[通俗易懂]JVM垃圾回收机制提到Java垃圾回收机制就不得不提到一个方法:system.gc()用于调用垃圾收集器,在调用时垃圾收集器将运行以回收未使用的内存空间,它将尝试释放被丢弃对象所占用的空间。作为程序员有必要了解gc方法,这也是在面试中经常会被问及的问题:我们从三个方面来理解gc:1.JVM如何确定哪些空间能被回收?2.JVM会在什么时候进行垃圾清除的动作?3.JVM如何清除垃圾的?1.JVM如…

  • 最优化算法之粒子群算法(PSO)

    最优化算法之粒子群算法(PSO)一、粒子群算法的概念  粒子群优化算法(PSO:Particleswarmoptimization)是一种进化计算技术(evolutionarycomputation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.  PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制…

  • idea快捷键大全最新文档(ctrl快捷键大全截图)

    Ctrl快捷键 介绍 Ctrl+F 在当前文件进行文本查找(必备) Ctrl+R 在当前文件进行文本替换(必备) Ctrl+Z 撤销(必备) Ctrl+Y 删除光标所在行或删除选中的行(必备) Ctrl+X 剪切光标所在行或剪切选择内容 Ctrl+C 复制光标所在行或复制选择内容 …

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号