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
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?的更多相关文章
- Laravel 中 Controller访问Model函数/常量
<?php // User.php class User extends Model { ; //进行中 const USER_TYPE_TEST = 'test'; //测试用户 // 需要在 ...
- Spring框架中ModelAndView、Model、ModelMap区别
原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别 注意:如果方法 ...
- laravel中get()与 first()区别、collection与stdClass的区别
简单的,laravel里get()得到的是一组数据,first()得到的是一个model数据. 从形式上,laravel里每一个model数据(record),在取出的时候都是用的PHP的stdCla ...
- SPRING框架中ModelAndView、Model、ModelMap区别及详细分析
转载内容:http://www.cnblogs.com/google4y/p/3421017.html 1. Model Model 是一个接口, 其实现类为ExtendedModelMap,继承了M ...
- Spring框架中ModelAndView、Model、ModelMap区别 (转)
原文地址:http://www.cnblogs.com/google4y/p/3421017.html SPRING框架中ModelAndView.Model.ModelMap区别 注意:如果方法 ...
- laravel中的scope作用域
laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope laravel中要求在定义的方法scope后面跟的字母要大写 后面那我 ...
- 代码演示C#中string和StingBuilder内存中的区别
关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. //Demo string memory model namespace C ...
- Laravel中的队列处理
Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能
顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ...
随机推荐
- 解决Eclipse中springBoot中文乱码问题
除了常见的application.properties文件中设置#设置spring-boot 编码格式banner.charset=UTF-8server.tomcat.uri-encoding=UT ...
- lumen时区
今天用 Lumen 框架写代码时, 也是初次体验 Lumen, 遇到了一个问题, 从数据库里查出的时间比数据库里保存的 TIMESTAMP 时间慢了8个小时, 很明显这是一个时区设置的问题, 本以为可 ...
- Windows去除开始菜单图标背景
1.开始菜单图标右键找到目标程序的存储目录. 2.删除目录下的目标程序名+.VisualElementsManifest.xml的文件. 3.开始菜单图标右键找到图标的存储目录,取消开始屏幕固定并删除 ...
- 用 Portainer 远程管理 docker
参考的官网地址为:https://portainer.readthedocs.io/en/stable/deployment.html 先更新Centos docker 镜像加速地址: curl -s ...
- kubesphere-wokespaces
kubesphere - workspaces 详解: workspaces :企业空间 登陆kubesphere后,会看到一个默认的企业空间 " system-workspace &q ...
- 开源Android 恶意软件Radio Balouch
安全研究机构 ESET 首次发现了开源 Android 间谍软件在 Google Play 上的恶意信息窃取行为,并且在被删除后仍在Google Play 重复出现.据悉,第一个间谍软件是基于开源间 ...
- linux基础—课堂随笔010_系统启动和内核管理
系统启动和内核管理 Linux: kernel+rootfs kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs:程序和glibc 库:函数集合, functio ...
- 【墨西哥区域赛】Carpet
原题: 题意: 给你一个树,有1e5个节点,让你把这个树放在一个长1e6宽20的网格图里,要求一个格子放一个节点,树边之间不能相交 这是一道构造题 因为树的形状可能性很多,很复杂,所以不能简单猜测,而 ...
- H265码流格式
一.H265码流格式 VPS:视频参数集,用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频的扩展. NALU header定义: NALU header(){ Descriptor f ...
- SqlServer获取当前日期
1. 获取当前日期 select GETDATE() 格式化: ) ---- :: 2. 获取当前年 --2017 3.获取当前月 --05或5 4.获取当前日期 --07或7 select DAY ...