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

3分钟短文:Laravel 模型查询数据库几个关键方法

引言 本期继续我们laravel学习,主要说一说laravel使用eloquent orm 模型 读取数据库条目的几个常用方法。 ?...eloquent门面为我们提供很多好用链式操作方法, 在query builder筛选出合适条目后,返回一个eloquent collection,或者一个 基类collection对象,可以直接使用集合方法操作数据集...所以我们推荐使用where语句进行数据库SQL操作,将合适结果集返回,这样精简数据库负载, 再者,使用集合操作方法,对结果集进行进一步格式化,效率会高多。...对于web应用,可以简单使用前几期我们使用 firstOrFail 方法,便捷去除第一个条目, 或者找不到时候,抛出异常。...顺带再说一下聚合函数,使用关系型数据库很大因素就是其拉取关系型数据很高效, 因此也内置很多聚合函数用于数据聚合操作。

2.1K40

SqlAlchemy 2.0 中文文档(十九)

急切加载指从查询返回对象中,相关集合或标量引用已经提前加载。...如果某些关系指定lazy='joined'或lazy='selectin',例如,使用lazyload('*')将单方面导致所有这些关系使用'select'加载,例如,当访问每个属性时发出 SELECT...如果我们只想使用一个 JOIN 来加载集合并排序,我们可以使用 contains_eager() 选项,下面描述 将明确 JOIN/语句路由到急切加载集合。...如果我们只想使用一个 JOIN 来加载集合并排序,我们可以使用contains_eager()选项,下面描述将显式连接/语句路由到急加载集合。...举例来说,我们可以加载一个User对象,并仅急切加载其中特定地址到其.addresses集合中,方法通过过滤连接数据,并使用 contains_eager() 路由它,同时还使用 Populate

13210
您找到你想要的搜索结果了吗?
是的
没有找到

3分钟短文 | Laravel 检验关联模型是否存在2个必知必会方法

引言 接着我们Laravel系列说下去。今天主题在程序内,用什么方法判断,模型关联模型是否存在呢? 本文通过对比分析,教会大家如何正确判断 exists,或判断 null。...这时我们可以使用追加字段修改器, public function setOptionArrayAttribute($values) { $this->option->update($values...如果更新时候,关联模型有可能不存在。这个时候做 update 更新操作,会返回 None 对象没有 update 方法这样错误。 所以逻辑上需要一个判断,先判断关联模型是否存在。...其实,在Laravel中,使用 $this->option 援引关联模型时,如果存在,则返回关联模型对象或集合如果不存在则是 Null 对象。所以我们可以使用判空方式。...比如使用 count 计数,这可以兼容一对一,一对多情景: if (count($this->option)){ // exists } 在 PHP7.2以后,可以用 exists 方法判断:

91030

Laravel学习记录--Model

普通渴求是加载 渴求是加载多个关联关系 嵌套渴求式加载 渴求式加载指定字段 带条件约束渴求式加载 懒惰式渴求式加载 当以属性方式访问Eloquent关联关系时候,关联关系数据[懒惰式加载]因为都是用到时候才执行查询...使用渴求式加载,即根据预先需求查询出所有数据 为了验证[渴求式加载]好处,举下列例子 这里用到了Laravel Debugbar 调试 安装方法可参照我另一个博客 - - - Laravel...显示结果 懒惰渴求式加载 有时候你需要在父模型已经被获取后渴求式加载一个关联关系。...,并且电话id = 1; } 关联数据计数 如果你只想统计结果数并不需要加载数据,那么可以使用withCount方法,此方法会在你结果集模型中添加一个{关联名_count}字段 如查询每个用户号码数量...,并且没有放在数组里id会被移除,如果这样的话那1号学生选修课程1将被移除,同时会向中间表添加课程id=9记录 接下来看他执行过程是否与我们一样 通过Laravel Debugbar

13.5K20

SqlAlchemy 2.0 中文文档(三)

如果看起来有很多冗余 SELECT 语句,看起来它们可以更有效合并为一个,如果对象在已经分离Session中不适当地发生加载,那就是使用加载策略时候。...: 连接急切加载禅意 - 详细描述上述问题 将显式连接/语句路由到急切加载集合 - 使用 contains_eager() Raiseload 值得一提另一个加载器策略 raiseload...另请参阅 在 ORM 查询指南中关系 WHERE 运算符部分 加载策略 在加载关系部分,我们介绍一个概念,即当我们处理映射对象实例时,默认情况下访问使用relationship()映射属性时,如果集合未填充...中两个部分: 急切加载禅意 - 详细描述上述问题 将显式连接/语句路由到急切加载集合中 - 使用 contains_eager() Raiseload 还值得一提一种额外加载策略...中两个部分: + 急切加载禅意 - 详细描述上述问题 + 将显式连接/语句路由到急切加载集合中 - 使用 `contains_eager()` ### Raiseload 还值得一提一种额外加载策略

12920

使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁

Laravel 中 sharedLock 与 lockForUpdate 区别 sharedLock 对应 LOCK IN SHARE MODE lockForUpdate 对应 FOR UPDATE...transaction 要更新同一个计数器,如果使用 lockForUpdate, 会导致两个 transaction 同时读到同一个初始值,然后在应用层逻辑中增加计数之后,提交到数据库中,后者操作会覆盖掉前者操作...for update 还是 lock in share mode 都无法读取到数据,更加确切说是,查询被阻塞。...需要注意,发起者必须在 transaction 里上锁才有效,如果不是在 transaction 中,上锁无效。但是,第二个人无论是不是在 transaction 里,都会被锁。...我依然有几个疑问 Laravel 如何设置数据库操作超时时间 什么场景下适合使用 sharedLock 呢?

2.5K20

使用 Laravel sharedLock 与 lockForUpdate 进行数据表行锁「建议收藏」

大家好,又见面,我全栈君。 场景 拼团功能,当 A 客户开团之后(两人团),如果 B 和 C 同时支付,如何规避两人同时将拼团人数增加。...Laravel 中 sharedLock 与 lockForUpdate 区别 sharedLock 对应 LOCK IN SHARE MODE lockForUpdate 对应 FOR...transaction 要更新同一个计数器,如果使用 lockForUpdate, 会导致两个 transaction 同时读到同一个初始值,然后在应用层逻辑中增加计数之后,提交到数据库中,后者操作会覆盖掉前者操作...for update 还是 lock in share mode 都无法读取到数据,更加确切说是,查询被阻塞。...我依然有几个疑问 Laravel 如何设置数据库操作超时时间 什么场景下适合使用 sharedLock 呢?

2.6K10

Laravel Eloquent 模型关联关系(下)

在前面两篇教程中,学院君陆续给大家介绍 Eloquent 模型类支持七种关联关系,通过底层提供关联方法,我们可以快速实现模型间关联,并且进行关联查询。...关联查询 关于关联查询,我们在前面介绍关联关系定义时候已经穿插着介绍过,这里简单回顾下。...另外,如果访问模型实例上 author() 方法时,返回不是用户实例,而是一个关联关系实例,该实例注入了查询构建器,所以你可以在其基础上通过方法链方式构建查询构建器进行更加复杂查询,我们以一个一对多查询为例...: 这个功能用于不考虑性能场景进行快速查询还是很方便,但如果对性能有较高要求,则不推荐使用,毕竟是要执行多次查询才能逐个统计出来。...(31); $comment->content = 'Laravel学院致力于提供优质Laravel中文学习资源'; $comment->save(); 再次查看评论模型及对应文章模型数据,可以看到文章模型更新事件和评论模型更新时间已经一致

19.5K30

Java岗大厂面试百日冲刺【Day41】— JVM3 (日积月累,每日三题)

,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零对象就是不可能再被使用。   ...其优点实现简单,判定效率高;缺点该算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确工作,且存在一个基本难题,也就是很难处理循环引用关系。...除了固定 GC Roots 集合以外,根据用户所选用垃圾收集器以及当前回收内存区域不同,还可以有其他对象 临时性 加入,共同构成完整 GC Roots 集合。...对于一个普通对象,如果没有其他引用关系,只要超过了引用作用域或者显式将相应(强)引用赋值为null,就是可以被垃圾收集,具体回收时机还是要看垃圾收集策略。...应用场景:软引用通常用来实现内存敏感缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证使用缓存同时,不会耗尽内存。

21020

SqlAlchemy 2.0 中文文档(十八)

] (2,) 现在,Book.summary列已经急切加载,并且可以在不发出额外 SQL 情况下访问: >>> print(book.summary) another long summary...比如,如果我们想要发出一个查询,加载 `User` 对象,但也包括每个 `User` 拥有多少书籍计数我们可以使用 `func.count(Book.id)` 将“计数”列添加到一个查询中,该查询包括与...如果我们不想改变 User.books 默认加载样式,但仍要对 Book 应用加载规则,我们使用 defaultload() 选项进行关联,在这种情况下,将保留默认关系加载样式 "lazy",并将我们自定义...如果我们不想更改User.books默认加载样式,但仍要将加载仅规则应用于Book,我们使用defaultload()选项进行链接,在这种情况下,将保留默认关系加载样式"lazy",并将我们自定义...例如,如果我们想要发出一个查询,加载 User 对象,但还包括每个 User 拥有多少书籍计数我们可以使用 func.count(Book.id) 来向查询中添加一个“计数”列,该查询包括与 Book

15710

《数据库系统实现》学习笔记

交\cap、并\cup、差-,连接和积集合形式和包形式。要求这类操作一个关系操作对象大小限制在M以内。 4.2.1 一次单个元组一趟算法 非常简单,如果关系R聚集,那么IO代价B。...然后一个一个读取R元组t,假如元组t在S中,且计数不为0,则将计数减一,如果元组t不在S中或在S中且计数为0,则输出。 在open方法中阻塞 积 将S读入内存,不需要特殊结构。...在这个阶段中,最多能对M-1个有序子表进行归并,这就限制R大小。 归并流程如下: 加载每个子表第一块做缓冲块。 找到所有块中最小元素移到输出缓冲区(只有一块)。...否则,找到两个关系中具有相关关键字y所有元组。 输出通过连接R和S中具有共同y值元组连接。 如果一个关系在内存中已没有要考虑元组,就加载下一个元组。...下一步在5.2节列出代数定律上重写计划。 一下优化器最常用到: 选择尽可能深推入表达式树。如果一个选择条件多个条件AND,我们可以把该条件分解并分别将每个条件下推。 投影下推。

2.5K20

具有嵌套关系可重用API资源——Laravel5.5

避免批量赋值使用 Laravel 属性来指定哪些字段可以被批量赋值,以防止不受控制数据注入。· 播种数据库<?...能够在资源类中进行关系转换,但是有条件:如果数据可用已经加载),就可以进行转换;如果数据尚未加载,可以选择忽略这个转换。...这样做有利于避免 N+1 查询问题(在获取关联数据时出现效率问题),同时可以使用单个资源类处理不同情况。如果关联数据不可用,资源类会忽略它;反之,如果可用,资源类会将其包含在返回数据中。...对比 Fractal 和 Laravel 资源本文提到 Fractal 在转换层(Transformer)提供默认和可用包含(includes)功能,但是 Laravel 原生 API 资源更倾向于让控制器处理这个逻辑...毕竟,控制器工作理解请求。这暗示着对于数据包含处理,Laravel 更多依赖于控制器层面的逻辑,而不是在资源转换层实现。

11810

Laravel代码简洁之道和性能优化

经过一番调研之后发现一个堪称神器扩展:laravel-upsert 这个 Laravel 扩展为查询构建器和 Eloquent 添加了对 INSERT & UPDATE (UPSERT) 和 INSERT...IGNORE 支持 先简单说明一下业务场景: 首先表结构设计:互相喜欢和添加联系人都是双向关系,即入库A B,B A这样成对双向数据 触发互相喜欢,插入2条双向数据,插入之前校验是否存在,存在不重复添加...如果互相喜欢,则添加双向联系人关系,插入之前校验是否存在,存在则更新type等字段,不存在则插入双向数据 我们通过这个场景能非常好体会laravel-upsert强大,不仅减少了代码量,也减少了sql...当然还是有一些注意点和坑,下面分享一下 注意问题 要根据需求添加唯一索引 根据官方文档中说明,我们model中必须添加这行代码,才能以Eloquent方式用 use \Staudenmeir\...LaravelUpsert\Eloquent\HasUpsertQueries; 因为我们数据库时间int类型,不是laravel默认时间格式,并且我们插入时间和更新时间也不是laravel默认字段

5.7K20

SqlAlchemy 2.0 中文文档(十二)

()配置与“正常”一对多关系工作方式相同,唯一例外,“方向”,即关系一对多还是多对一,默认假定为一对多。...['subchild1', 'child2'] ```## 配置自引用急切加载 在正常查询操作期间,通过从父表到子表连接或外连接来发生关系急切加载,以便可以从单个 SQL 语句或所有子集合第二个语句中填充父对象及其直接子集合或引用...['subchild1', 'child2'] 配置自引用关系急切加载 通过在正常查询操作期间从父表到子表使用连接或外连接来进行关系急切加载,以便可以从单个 SQL 语句或所有直接子集合第二个语句中填充父表及其直接子集合或引用...然而,要想使用自引用关系急切加载,需要告诉 SQLAlchemy 应该加入和/或查询多少级深度;否则,急切加载将根本不会发生。...另请参阅 邻接列表关系 - 单表版本 自引用查询策略 - 关于使用自引用映射进行查询提示 配置自引用急切加载 - 使用自引用映射进行急切加载提示 ## 复合“次要”连接 注意 本节介绍

10110

SqlAlchemy 2.0 中文文档(十三)

相关集合可能不仅在访问时加载到内存中,或者急切加载,而且在集合本身发生变化时以及在由工作单元系统删除所有者对象时也需要进行填充。...删除项目 在当前Session中加载个体项可能会被标记为要从集合中删除,使用WriteOnlyCollection.remove()方法。当操作继续时,刷新过程将隐式将对象视为已经集合一部分。...在操作继续时,刷新过程将隐式考虑对象已经集合一部分。...当操作进行时,刷新过程将隐式考虑对象已经集合一部分。...与其必须阅读 SQL 日志以确定所有必要属性是否已经被急加载,不如使用“raise”策略,如果访问了未加载属性,将立即引发未加载属性。

7210

简单聊聊G1垃圾回收算法整个流程 --- 理论篇 -- 上

但是,计数过程中操作对象也可能会被转移记忆集合(remembered set)线程使用,因此需要先停掉记忆集合线程。 记忆集用于记录跨区域之间引用关系。...并发计数阶段和用户线程并行执行,到此时为止所有存活对象都已经被标记出来了,G1后续会按照当前时刻快照进行筛选回收,所以即使此刻用户线程又更改了引用关系,也不会有什么影响,所以可以停止掉记忆集合线程。...当进入后续筛选回收阶段时,还是处于STW状态,相当于是以最终标记这一刻快照为准,进行筛选加对象转移,所以以上论述都是为了证明此刻停掉记忆集合线程没有什么关系,用户在计数阶段变更引用关系,会在下一波GC...因为对象 b 所对应的卡片索引就是 2048,所以对象 b 对对象 a 引用被准确记录了下来。 由此我们可以明白,区域间对象引用关系由转移专用记忆集合以卡片为单位粗略记录。...传入from应该是引用对象地址,to被引用对象地址,这里引用对象地址如果还处在待回收区域中,那么就无需建立此次映射关系了,因为后面等到该对象转移时,还是需要重新建立映射关系,不仅是与引用它对象

1.3K20

【JVM进阶之路】五:垃圾回收概述和对象回收判定

在Java内存区域中: 程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中栈帧随着方法进入和退出而有条不紊执行着出栈和入栈操作,所以这几个区域内存回收确定,随着方法结束或者线程结束...引用计数算法这样:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零对象就是不可能再被使用。 ?...在这种情况下,a 和 b 实际上已经死了,但由于它们引用计数器皆不为 0,在引用计数心中,这两个对象还活着。因此,这些循环引用对象所占据空间将不可回收,从而造成了内存泄露。...这个算法实质在于将一系列 GC Roots 作为初始存活对象合集(Gc Root Set),然后从该合集出发,探索所有能够被该集合引用到对象,并将其加入到该集合中,这个过程我们也称之为标记(mark...3、Java中引用 无论通过引用计数算法判断对象引用数量,还是通过可达性分析算法判断对象是否引用链可达,判定对象是否存活都和“引用”离不开关系

35730

如果这题都不会面试官还会继续问我 JVM 嘛:如何判断对象是否可回收

简单说就是内存中已经不再被使用空间就是垃圾 其次,什么垃圾收集(Garbage Collection,下文简称 GC)? 简单来说,就是清除垃圾占用空间,从而给新生对象腾出内存空间。...回顾下 Java 内存运行时区域,程序计数器、虚拟机栈、本地方法栈 这 3 个区域线程私有的,随线程而生,随线程而灭,栈中栈帧随着方法进入和退出而有条不紊执行着出栈和入栈操作。...所以,我们今天这篇文章目的,就是探讨如何判断对象是否已经成为垃圾。 老规矩,背诵版在文末。...因此,如果某个对象已经不存在任何引用指向它,就说明这个对象已经没有作用了,就是一个垃圾。 所以,很显然一个办法就是通过引用计数来判断一个对象是否可以回收。...,偷个懒吧) 另外,需要注意,除了这些固定 GC Roots 集合以外,根据用户所选用垃圾收集器以及当前回收内存区域不同,还可以有其他对象引用 “临时性” 加入,共同构成完整 GC Roots

36210

JVM 怎么把“送”出去内存又“要”回来

所以需要动态管理这部分内存。 什么时候回收? 在堆中实例对象,如果想要把这部分内存回收,一定要确定这里所保存实例对象哪些还在被使用,哪些已经没有用了,即允许回收。...如果已经做了一次回收,还是不够用,那就把没被引用我回收吧。 … 在这种需求提出后 JDK2之后,Java 补充对象引用概念,将引用分为强、软、弱、虚四种。...标记确认:在已经标记对象集合中,会进行一次筛选,筛选条件当前对象是否有必要执行 finalize() 方法。如果有必要执行则继续 存活,如果没有必要则 死亡。...加载该类加载已经被回收,这个条件除非经过精心设计可替换类加载场景,如OSGi、JSP加载等,否则通常是很难达成。...多了解一点: 其中第三点与我们经常见到操作诸如 spring 这种大量使用反射框架、JDK 动态代理、以及 CG lib 这种操作字节码框架基本上都需要 JVM 拥有类卸载功能,否则会导致一些自定义加载加载临时类信息占据着方法区内存

46710

加加减减奥秘——从数学到魔术思考(一)

计数出现和发展就从一个侧面很好体现这一过程: 图1:数量扩充和发展(箭头左侧为累积数集,右侧为新发明数集) ?...直到有一天,抓了好几头长得都差不多应该都是野猪东西,或者打了一箩筐大大小小但味道差不多枣子时候,要管理起来,集合诞生了,要知道有多少猪,对集合进行大小度量,于是有对其进行计数需要,正整数就正式光荣发明使用了...计数对一个有着相同性质元素组成集合大小度量过程,而两个同样性质互不相交集合合并时候(都是某全集子集),新集合大小结果,我们称为前面两个集合大小度量数和。...这里建模和抽象过程其实已经在大量使用我们沿用至今建模思想了,集合原生概念,简化假设(大大小小,各式各样都是枣子,不会合并,丢失,繁殖等等),定义假设(每个枣子都不一样且都有枣子属性),最后倒在一起形成一筐新枣子或和这个等价物理过程...+ (b + c) 结合律:三筐枣子倒在一起,先合并前两个还是后两个,对最后结果也没有影响; 也正因为求和一个集合属性,集合元素本身无序,可以随意打乱,这一性质便又可以设计以和为中心数学魔术

63030
领券