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

 

额?

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

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

 

底层机制.

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

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

 

深入 Eloquent

 

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

Laravel 中如何区别 Model 或者是 Builder?的更多相关文章

  1. Laravel 中 Controller访问Model函数/常量

    <?php // User.php class User extends Model { ; //进行中 const USER_TYPE_TEST = 'test'; //测试用户 // 需要在 ...

  2. Spring框架中ModelAndView、Model、ModelMap区别

    原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别   注意:如果方法 ...

  3. laravel中get()与 first()区别、collection与stdClass的区别

    简单的,laravel里get()得到的是一组数据,first()得到的是一个model数据. 从形式上,laravel里每一个model数据(record),在取出的时候都是用的PHP的stdCla ...

  4. SPRING框架中ModelAndView、Model、ModelMap区别及详细分析

    转载内容:http://www.cnblogs.com/google4y/p/3421017.html 1. Model Model 是一个接口, 其实现类为ExtendedModelMap,继承了M ...

  5. Spring框架中ModelAndView、Model、ModelMap区别 (转)

    原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别   注意:如果方法 ...

  6. laravel中的scope作用域

    laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope laravel中要求在定义的方法scope后面跟的字母要大写 后面那我 ...

  7. 代码演示C#中string和StingBuilder内存中的区别

    关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. //Demo  string memory model namespace C ...

  8. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

  9. 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能

    顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ...

随机推荐

  1. px自动换算rem

    //designWidth:设计稿的实际宽度值,需要根据实际设置//maxWidth:制作稿的最大宽度值,需要根据实际设置//这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最 ...

  2. 文件存储Mongo DB后前端对于文件操作的处理方式

    以下是关于后端对于附件从存储服务器改为存储到Mongo DB后,前端对于一些常见需求处理方式的修改:包括文件上传下载和富文本编辑中的贴图实现. 一.文件上传(记录关于fetch中post请求Conte ...

  3. Nginx如何配置防盗链

    配置要点 none : 允许没有http_refer的请求访问资源: blocked : 允许不是http://开头的,不带协议的请求访问资源: 119.28.190.215 start.igrow. ...

  4. java技术面试之面试题大全

    转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...

  5. IntelliJ IDEA 接口类跳转到实现类及实现类跳转到接口

    接口和实现类的互相跳转是使用IntelliJ IDEA过程中常用的操作,在此记录一下: 1.Service接口跳转到实现类 操作:在接口类的方法上使用快捷键Ctrl+Alt+B,或者点击下图所示位置 ...

  6. Hive的日志操作

    想要看hive的日志,我们查看/home/hadoop/hive/conf/hive-log4j2.properties # list of properties property.hive.log. ...

  7. JavaScript【对象的学习】

    JavaScript对象的了解 1.js的String对象创建String对象:var str = "abc";方法和属性(参照W3C文档详细学习)属性 length:字符串的长度 ...

  8. Tomcat集成到MyEclipse

    1.Tomcat集成到MyEclipse 使用MyEclipse配置服务器后,就可以使用MyEclipse来启动和停止服务器了.当然,你需要先安装好服务器(Tomcat),才能配置.MyEclipse ...

  9. Python学习 第一天(一)初始python

    1.python的前世今生 想要充分的了解一个人,无外乎首先充分了解他的过去和现在:咱们学习语言也是一样的套路 1.1 python的历史 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈp ...

  10. 给定一个矩阵 A, 返回 A 的转置矩阵。

    给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7], ...