精选内容/技术社群/优惠产品,尽在小程序
立即前往

Laravel Eloquent 模型关联关系(下)

从性能上来说,渴求式加载更优,因为它会提前从数据库一次性查询所有关联数据,而懒惰式加载在每次查询动态属性的时候才会去执行查询,会多次连接数据库,性能上差一些(数据库操作主要开销在数据库连接上,所以在开发过程中如果想优化性能...,如果返回的文章结果是列表的话,需要遍历获取作者信息,假设要循环 N 次的话,加上文章模型本身的获取,总共需要进行 N + 1 次查询,而 PHP 对数据库的连接是短连接,每次都要重新连接数据库,所以从性能角度考虑不建议使用这种方式...另外,如果访问的是模型实例上的 author() 方法时,返回的不是用户实例了,而是一个关联关系实例,该实例注入了查询构建器,所以你可以在其基础上通过方法链的方式构建查询构建器进行更加复杂的查询,我们以一个一对多的查询为例...,通过 IN 查询获取关联结果,并将其附着到对应的模型实例上,在后面访问的时候不会再对数据库进行查询。...所以不管模型实例有多少个,关联结果只会查询一次,加上模型本身查询总共是两次查询,在列表查询时,大大减少了对数据库的连接查询次数,因而有更好的性能表现,推荐使用。

19.6K30

为什么 Laravel 这么优秀?

因为我们已经完成了数据表中字段的定义、表与表的关系、以及最重要的一步:如何将数据及数据之间的关系写入数据库中,下面简单的来介绍下在 Laravel 是如何完成的。...Laravel Migration 还提供了 Rollback 机制,既可以 rollback 最近的一次数据库变更。...比如你在上一次变更操作中错误的设置了某个表的索引,那我理解的正确的做法不是回滚,而是创建一个新的迁移文件,并在新的迁移文件中 ALTER 之前的修改。...中可以高效的使用 Eloquent ORM 实现各种查询;如上面的例子中我们使用了 withCount 来查询课程的学生数量、用 with 加载课程对应的教师;还可以指定生成的 SQL 查询只包含某几个字段如...,在完成开发时选择自己以及团队合适的,而不是只会写 Java 就觉得其他语言啥都不是。

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

    Laravel项目的性能优化

    如果您信息不够及时,预加载是一种通过使用特定语法来减少发送到数据库的查询数量来提高 Eloquent 性能的方法。 更改基础查询以避免此性能问题。 您将只执行两个查询而不是1001!...这是巨大的性能提升。 优化八:缓存查询结果 有时候, 缓存一个具体的查询结果可能是一个好主意。 想象这样一个场景:你准备在你的应用主页上展示 排行榜。...这项工作是通过从数据库中执行查询完成的(查询可能涉及到artists表以及其他的一些表)。 你的主页访问量是 1000 次/小时 。...如果这个排行榜数据的查询次数是 1000次每小时,那么一天下来执行的查询次数就是24000次。 现在,让我们假设这个排行榜是每小时更新一次 。那么,将每次的查询结果缓存一小时如何 ?...因为我见过非常多的应用,它们的数据表没有索引。 实现起来很简单,您可以创建一个新的数据库迁移并使用里面的方法来添加索引. 当然,索引不是您喜欢在哪建就直接创建一个就是了。

    3.8K30

    30分钟用Laravel实现一个博客

    编辑这两个迁移文件 create_blogs // 首先类定义中,有两个方法,up()可以理解为正向操作:创建表,而 down()可以理解为回滚操作:删除表。...所以我们设置一下它的 用户名 邮箱 以及密码 其余的Seeder我们可以只插入模拟的数据即可。...而评论则是只要有人注册账号,就可以评论了,所以我们应该对评论进行一些校验以防恶意攻击。...视图方面 我们有通过 auth 生成的模板 Laravel 自带的 bootstrap4 + jquery 所以我们解决了css和js的问题 => 我们只是写了一个 “确认删除” 的前端代码 数据库方面...当然,我们还有 Request 请求认证 Policy 策略控制等等一些列的特性没有学习,我们也只使用了一次composer,其实在开发Laravel时,我们还可以使用非常多的,支持Laravel的,完善的轮子可以利用

    7.4K00

    Laravel框架关键技术解析

    语法 A.组件化开发语法条件 1.命名空间 PHP命名空间只支持导入类,而不支持导入函数或常量 对命名空间中的名称来说,最前面是不允许有反斜杠的 对完全限定名称的函数、类和常量可以直接解析 对所有非限定名称和非完全限定名称的函数...3.服务容器只有一个,而服务提供者遍布整个框架的各个功能模块内 4.对于Laravel框架,当接收到一个请求时,就会为了处理这个请求首先生成一个服务容器,用于容纳处理请求需要的服务 5.回调函数绑定的就是一个回调函数.../laravel5.4cn 十、数据库及操作 A.数据库迁移与填充 1.Laravel的数据库迁移其实是定义了一个统一的接口来实现数据库架构的创建和维护,而这种统一的接口与底层的数据库及其操作语言都是无关的...//创建,第一次要composer down-autoload一下 php artisan db:seed [—class=类名] B.查询构造器 1.Laravel框架的查询构造器是在PDO扩展基础上设计的一个...“重量级”的数据库扩展 2.查询构造器建立过程: 一个是数据库连接封装阶段 一个是查询构造器生成阶段 3.数据库封装阶段: 一是数据库管理器阶段,\Illuminate\Database\DatabaseManager

    12K20

    【Laravel系列4.6】

    事务 对于数据库来说,事务操作是非常经典而且也很实用的一个技术。具体事务是干什么的我们就不多说了,毕竟这也不是数据库知识普及的文章。在电商、金融类应用中,事务是非常重要的功能,也是必须的能力。...接下来我们找到 beginTransaction() 的实现方法,就是在 laravel/framework/src/Illuminate/Database/Connection.php 类所引用的 laravel...PDO 属性设置 来填坑了,在【Laravel系列4.2:查询构造器】https://mp.weixin.qq.com/s/vUImsLTpEtELgdCTWI6k2A中,我们说过一个问题,那就是查询构造器查询出来的结果都是...之前我们已经说过,查询构造器 最终调用的结果还是使用的 原生查询 的这几个方法,所以我们从这个 select() 方法入手。...还记得吗,在 Model 中查询返回的结果,每条数据都会直接是这个 Model 对象,而不是 stdClass ,这一点,就真的和 JavaBean 是完全相同的概念了。

    1.4K30

    通过 Laravel Eloquent 模型实现简单增删改查操作

    ,简单来说,它会构建类与数据表之间的映射关系,从而建立起一个可在编程语言里使用的「虚拟对象数据库」。...如果你的数据表里面不包含这两个字段,或者只包含一个,都需要设置 public $timestamps = false; 或者通过 CREATED_AT 和 UPDATED_AT 常量来设置自定义的创建和更新时间字段...你可以直接通过 $user->name 这样的方式访问模型类实例的属性。...,就等同于掌握了 Laravel 中的所有数据库查询操作。...此外,Eloquent 还为我们提供了一些快捷的插入方法,比如 firstOrCreate 和 firstOrNew,这两个方法都会先尝试通过指定查询条件在数据库中查找对应记录,如果没有找到的话,会创建对应模型类的实例

    8K20

    Laravel Eloquent 模型关联关系详解(上)

    我们所熟知的 MySQL、SQL Server、Oracle 都是关系型数据库,何谓关系型数据库?简单来说就是数据表之间存在关联关系。...你可能注意到了我们在定义关联关系时,仅仅指定了模型类名,并没有指定通过哪些数据表字段建立关联,这并不是说 Laravel 神通广大,能知过去未来之事,而是因为 Eloquent 对此做了默认的约定。...如果是单条记录获取关联关系,就需要两次查询;如果是多条记录获取关联关系,比如文章列表页获取作者信息,因为每篇文章的作者通过动态属性获取都有一次查询,所以对N条记录来说,需要「N+1」次查询才能返回需要的结果...能不能一次就返回所有的关联查询结果呢?...,总共查询两次。

    10K40

    【Laravel系列4.1】连接数据库与原生查询

    连接数据库与原生查询 在 PHP 的学习中,数据库,也就是 MySQL 就像它的亲兄弟一样,永远没法分家。同理,在框架中,数据库相关的功能也是所有框架必备的内容。...Laravel 框架中的 DB 和 ORM 是两个不同的组件,关于 ORM 的概念,我们也将在相关的学习中了解到,但是现在我们先从简单的普通查询学起。...它有两个参数,一个是指定的配置文件中的键名,一个是如果没有找到的话,就会给一个默认值。关于这个函数,还记得我们在之前就已经讲过了。...仔细查看这两个方法,你会发现只有返回结果的地方是稍有不同的,statement() 返回的是布尔值,而 affectingStatement() 返回的是影响行数。...首先,我们新建一个数据库,就叫 laravel8 好了,并且同样的建立一个 raw_test 表,然后就是在 .env 中配置这个数据库的连接信息。

    3.2K50

    Hibernate 的性能优化的时候碰到了抓取策略,有四种

    (或多次)表的多次查询 整合到只需 要一次查询即可完成, 举个例子, 我们在初始化一个含有一对多关系的 Customer 与 Order 的时候, 会先查询 Customer 表,找到需要的 Customer..." fetch="subselect" /> )使用一条 Select 语句一次性抓取 回来, 这样减少了与数据库的交互次数, 一次将每个对象的集合都给初始化了; [他是如何这么智能的呢?...原来,他是将上一次查询的 SQL 语句作为这一次查询的 SQL 语句的 where 子查询, 所以上次查询到几个对象,那么这次就初始化几个对象的集 合----- 正因为如此, 所以 subselect...的例子,我查询出了 4 个 Customer 实体, Orders 开启了懒加载, 所以我现在来手动初始化一个 Customer 的 orders 属性, 这种策略本质上就是 select fetching...原本需要四次 Select 的查询, 由于 Batch-size=3 只用了两次 就完成了; 总结:     好了, 这里的四种抓取策略说明完了, 来全局看一下, 通过例子可以看出, 这四种抓取 策略并不是所有的情况都合适的

    1.2K70

    Hibernate 的性能优化的时候碰到了抓取策略,有四种

    (或多次)表的多次查询 整合到只需 要一次查询即可完成, 举个例子, 我们在初始化一个含有一对多关系的 Customer 与 Order 的时候, 会先查询 Customer 表,找到需要的 Customer..." fetch="subselect" /> )使用一条 Select 语句一次性抓取 回来, 这样减少了与数据库的交互次数, 一次将每个对象的集合都给初始化了; [他是如何这么智能的呢?...原来,他是将上一次查询的 SQL 语句作为这一次查询的 SQL 语句的 where 子查询, 所以上次查询到几个对象,那么这次就初始化几个对象的集 合----- 正因为如此, 所以 subselect...的例子,我查询出了 4 个 Customer 实体, Orders 开启了懒加载, 所以我现在来手动初始化一个 Customer 的 orders 属性, 这种策略本质上就是 select fetching...原本需要四次 Select 的查询, 由于 Batch-size=3 只用了两次 就完成了; 总结:     好了, 这里的四种抓取策略说明完了, 来全局看一下, 通过例子可以看出, 这四种抓取 策略并不是所有的情况都合适的

    58190

    高性能 MySQL 第四版(GPT 重译)(四)

    但不要只看图表;还要考虑您应用程序的查询。即使两个实体在某种程度上相关,如果您很少或从不在关系上进行连接,您可以打破关系以实现分片。...如果你选择的分片方案使跨片查询成为异常而不是规范,那么你将知道你选择的分片方案是一个好的选择。你应该努力使你的查询尽可能简单,并且包含在一个分片中。...如果在每个分片上复制数据太浪费,你可以将摘要表合并到另一个数据存储中,这样它们只存储一次。 非分片数据通常存储在全局节点中,并进行大量缓存以保护免受负载影响。...将您的堆栈迁移到 Vitess Vitess 是一个用于运行数据库层的有主见的平台,而不是一个即插即用的解决方案。因此,在您将其作为数据库访问层之前,您需要深思熟虑地计划如何实施这样的过渡。...请记住,我们为这些业务需求构建的解决方案应该假设服务器易于且可重复替换,而不是定制的。因此,如果您在下一次审计之前退休该机器并替换它,那么随机实例上的本地日志文件并不理想。

    18910

    万亿级企业MySQL海量存储分库分表设计实践

    ,而分裂后的两个页很难被写满,会造成页内碎片,所以业务主键在写入性能和磁盘利用率上都不如自增主键。...InnoDB就是这么做的,所以我们也称非主键列上的索引为二级索引(因为一次查询需要查找两个索引树) 二级索引有以下特点: 1、除了主键索引以外的索引; 2、索引结构叶子节点中的Data是主键值; 3、一次查询需要查找自身和主键两个索引...下面介绍电商业务中表和索引的重点设计原则以及两个实际案例 1、表设计原则 主键选择:前面我们已经对比分析过业务主键和自增主键的优缺点,结论是业务主键更符合业务的查询需求,而互联网业务大多都符合读多写少的特性...大家思考一个问题: 查询一个人的系统消息时,由于是按月分表,而大多数查询都是跨月的(因为需要查找30天内的消息),所以需要两次数据库交互。是否可以优化呢?...我们可以冗余存储,具体优化方案如下: 1、插入系统消息时写当前月和上个月两个表; 2、读从上一个月开始读; 如图4所示: 图4 冗余存储方式 这个方案我们可以保证一次查询可以找到用户所有有效期内的系统消息

    94120

    Laravel 数据库连接配置和读写分离

    默认情况下,我们在通过 Laravel 提供的数据库工具(DB 门面、查询构建器、Eloquent模型)连接数据库的时候,都没有显式指定连接,因为我们在配置文件中指定了默认的连接 mysql。...配置数据库读写分离连接 理论上来说,配置数据库读写分离连接也属于配置多个数据库连接的范畴,但是由于是一个比较特殊又很常见的使用场景,所以我们单独来讨论,Laravel 也对此进行了单独支持。...随着应用访问量的增长,对数据库进行读写分离可以有效的提升应用整体性能,关于数据库层面的读写分离配置不属于本教程讨论范畴,我们这里只讨论从应用层面如何在 Laravel 项目中配置读写分离连接。...Laravel 框架数据库底层代码对数据库读写分离进行了支持,所以我们需要遵循底层实现进行读写分离配置: 'mysql' => [ 'driver' => 'mysql', 'read'...针对读写分离数据库的连接,Laravel 数据库底层会自动判断,如果是查询语句会使用读连接,如果是数据库插入、更新、删除等操作会使用写连接。

    5.5K20

    【Laravel系列4.5】主从库配置和语法生成

    它的作用是,在同一次的请求中,如果执行了增删改的操作,那么紧接着的查询也会走 write 也就是主库的查询。...因此,在一次增删改操作后如果紧接着有查询的话,我们当前的这个请求流程还是会继续查询主库。 接下来,我们定义两个路由来测试。...接着去请求第二个路由,会发现数据还是原来的,并没有增加新的数据。因为我们并没有在 MySQL 配置主从同步,这也是为了方便我们的调试查看。很明显,第二个路由的查询语句走的就是另一个数据库了。...主对象是我们的 write 连接对象,而 read 连接对象是它的一个子对象。...这个就是我们最早学习使用过的那个原生查询所调用的方法。接下来,我们再看一下 get() 方法,也就是获得查询结果集的方法。

    4.3K20

    MySQL事务的ACID特性以及并发问题

    专栏持续更新中:MySQL详解 一、事务概念 InnoDB支持事务,而MyISAM不支持事务 一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了...,因为事务没有commit;而不可重复读和幻读不一定出问题,因为事务已经commit) 不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据 。...(Phantom Read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同。...例如 当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了(事务B读取了事务...ROLLBACK TO point1:事务只回滚到保存点point1,而不是回滚到初始状态 SET TRANSACTION_ISOLATION=‘REPEATABLE-READ’:设置事务的隔离级别

    23130

    【Laravel系列4.2】查询构造器

    其实就像我们上篇文章中学习过的使用原始 SQL 语句的方式来操作数据库一样,查询构造器这个东西就是在这个原始操作的基础上为我们封装了一系列的接口,能够让我们方便地来操作数据库。...通过链式调用,来构造 SQL 语句进行数据库的操作。注意,这里还不是完全的 面向对象 的写法。我们下篇文章要讲到的模型才是真正的面向对象的写法。...其实,查询构造器就相当于我们将原始 SQL 的操作进行了一次封装而已。而且,在模型中,其实内部调用的也是这个 查询构造器 。也就是说,查询构造器是介于 模型 和 原始语句 操作中间的一层。...使用 查询构造器 也是通过一个 DB 门面,但是,在这里我们需要通过 table() 方法指定一个表名。之后的操作就全都是针对这个指定的表名了。接下来,我们就可以通过链式调用的方式进行数据库的操作。...我们又发现了一个设计模式在 Laravel 框架中的应用,意外不意外,惊喜不惊喜! 连表查询 普通的连表查询的使用还是非常简单的,我也就不多说了,下面的代码中也有演示。

    16.8K10

    在线问题反馈模块实战(二十):实现文件批量导出到zip压缩包中功能

    我一听,这其实也是io操作的一种,虽然不是很常用,但是基本想实现该需求,也是简单的为此,我还是基于文件流的写法来逐一实现如何将批量实现文件的zip压缩,如果你也遇到的了这个需求并且没有啥思路,不用担心,...wrapper = new LambdaQueryWrapper(); wrapper.isNotNull(UserQuestionsEntity::getFilePaths);//只查询截图路径不为空的数据.../** * 将一个文件写入压缩包(一次只压缩一次) * * @param filePath 文件路径 * @param public void fileToZip...我们只需要在浏览器输入完整访问地址即可, 比如如下演示: 输入地址后,我们直接浏览器回车,我们可以看看到浏览器左下角会弹出一个xxx.zip的压缩包下载,这就证明我们起码成功了一半。        ...接下来,我们再检查一下,具体的文件夹子个数及子文件夹具体images数量,核实一下是否与数据库数据一致?经我查验,都是完整导出完好无损的。 正常给大家看下我后台查询数据所存储数据库的原本记录格式吧。

    40920

    【Laravel系列4.3】模型Eloquent ORM的使用(一)

    通过前两篇文章的铺垫,我们很容易就能操作 Laravel 中的模型,但是,真正要改变的是你看待这种操作数据库的方式。要把数据库里的数据想像成是编程语言中的对象,这才是 ORM 最主要的内容。...对于 Laravel 中标准的 Eloquent 模型类来说,每个表都应该有两个字段,一个是 updated_at ,另一个是 created_at ,分别是两个时间戳字段,用于记录数据的创建时间和修改时间...这个原理我相信已经不用我多解释了,和 查询构造器 的不同就是这里是通过 Model 起步开始构造的,而不是直接通过 DatabaseManager 起步的。...这个参数是可选的,如果不填,它会默认找一个叫做 sex_id 的值,当然,在我们的数据中是没这个字段的,所以我们指定为 sex 。...它判断的是这个 key 是否是抽象基类 laravel/framework/src/Illuminate/Database/Eloquent/Model.php ,而不是我们定义的 MTest ,用的是一个

    8.9K20

    一个业务场景的性能优化方案:并发+缓存

    一、背景 有一个功能,提供两个接口,一个是A服务查询列表某天的数据,一个是B服务查询列表中单个对象某天的数据。...需要实现的效果是, (1)调用A服务得到今天的数据 (2)然后再次调用A服务查询昨天的数据, (3)然后循环A服务获取的数据依次调用B服务,查询每个对象的其他属性,然后获取某个中间结果。...二、方案 如果服务A的两次请求和服务B的一次请求,服务提供方可以包装成一次,当然效率会更高,但是无法提供。 那么,肿么办?...服务A的两次是可以异步并发请求的,而服务B依赖于服务A的第一次请求结果,因此如果服务A两次异步并发请求,则理想条件下耗时为800ms。...循环,而且数据量很大) 数据库查询条件复杂没命中索引等 因此我们思考的角度是 将串行变为并行或并发 同步操作变异步操作 多个请求合并成一个请求 用空间换时间 算法时间复杂度的优化 提高机器性能(CUP/

    55130
    领券