Laravel 模型的关联查询 Debugbar 调试器 模型的预加载 ⑩②

news2024/11/18 1:34:56

请添加图片描述

@作者 : SYFStrive

 
请添加图片描述

@博客首页 : HomePage

📜: THINK PHP

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

📌:觉得文章不错可以点点关注 👉:专栏连接🔗


请添加图片描述
相关专栏

👉 VUEJS(🔥)
👉 MYSQL(🔥)
👉 微信小程序(🔥)
👉 PHPMYSQL(🔥)
👉 UNIAPP开发(🔥)

目录

  • PHP LARAVEL 简介
  • PHP LARAVEL 模型的关联查询
  •    关联查询
  • PHP LARAVEL Debugbar 调试器
  •    安装使用
  • PHP LARAVEL 模型的预加载
  •    预加载
  • 最后


                    ⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸   ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇   不能   ⡏⠀⠀  ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇   白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽   

提示:以下是本篇文章正文内容

PHP LARAVEL 简介

  • Laravel是一种流行的开源PHP Web应用程序框架,由Taylor Otwell在2011年创建并发布。它提供了一个简洁优雅的语法和丰富的功能集,旨在使Web开发过程更快速、简单和愉悦。
  1. MVC架构模式:Laravel采用了MVC(Model-View-Controller)架构模,将应用程序的逻辑分为不同的层,提高了代码的可维护性和可测试性。

  2. 简洁的语法和表达力:Laravel框架支持具有简洁而表达力的语法,使得编写清晰、易读、易维护的代码成为可能。

  3. 路由系统:它提供了一个强大且灵活的路由系统,通过简单的配置和代码即可定义Web应用程序的路由规则,实现URL到控制器的映射。

  4. 数据库抽象层:Laravel提供了一个简便的数据库抽象层,支持多种数据库系统,并通过Eloquent ORM提供了一种优雅的方法来与数据库进行交互。

  5. 权限和认证系统:Laravel提供了内置的身份验证和授权功能,使得实现用户身份验证、访问控制和权限管理变得简单和便捷。

  6. 缓存系统:Laravel支持多种缓存后端,包括文件、数据库、Memcached和Redis等,让你可以轻松地实现缓存数据,提升应用程序的性能。

  7. 强大的扩展性:Laravel通过Composer和Packagist等工具提供了丰富的扩展包生态系统,可以快速集成各种功能组件和第三方库,加快开发进程。

  8. 测试支持:Laravel鼓励编写和运行测试,提供了一套丰富的测试工具和断言,帮助开发者确保代码的质量和可靠性。

  • 总的来说,Laravel框架以其易用性、优雅的语法、丰富的功能和强大的扩展性受到了广大开发者的喜爱。它提供了

PHP LARAVEL 模型的关联查询

   关联查询

1 . 了解更多的查询方案;

//下面两种查询是一样的;
$books = User::find(19)->book;
$books = User::find(19)->book()->get();
//可以采用 where 筛选或闭包
$books = User::find(19)->book()
    ->where('id', 1)->orWhere('id', 11)->get();
$books = User::find(10)->book()->where(function ($query) {
    $query->where('id', 1)->orWhere('id', 11);
})->get();
  1. 使用 has()方法,可以查询某些条件下的关联查询数据;
//获取存在关联书籍的用户列表(言下之意:至少一本书)
$users = User::has('book')->get();
return $users;
//获取存在关联书籍(并超过 3 条)的用户列表
$users = User::has('book','>=', 3)->get();
return $users;
  1. 使用 whereHas()方法,创建闭包查询;
//whereHas 闭包用法
$users = User::whereHas('book', function ($query) {
//这里$query 是 book 表,通过 user_id 查询,返回 user 表数据
$query->where('user_id', 19);
})->get();
return $users;
  1. 使用 doesntHave()方法,即 has()的反向操作;
//获取不存在关联书籍的用户列表,闭包用法:whereDoesntHave()
$users = User::doesntHave('book')->get();
return $users;
  1. 使用 withCount()方法,可以进行关联统计;
//关联统计,会自动给一个 book_count 字段
//统计每个用户有多少本书
$users = User::withCount('book')->get();
return $users;
//给多个关系添加统计:profile_count,book_count
$users = User::withCount(['profile', 'book'])->get();
return $users;
//关联统计再结合闭包进行筛选,还可以设置别名
$users = User::withCount(['profile', 'book' => function ($query) {
//这里限制被统计的记录
$query->where('user_id', 19);
}])->get();
return $users;

PHP LARAVEL Debugbar 调试器

   安装使用

  1. 通过 composer 在项目中安装 Debugbar,命令如下:

安装调用器 👉 composer require barryvdh/laravel-debugbar

  1. 生成一个配置文件,给用户配置,可以根据需求进行配置;

php artisan vendor:publish --provider=“Barryvdh\Debugbar\ServiceProvider”

  1. 刷新页面,即可看到底部的调试工具,message 信息还需要引入;
use Barryvdh\Debugbar\Facade as DebugBar;
DebugBar::info('信息!');
  1. 如果想要关闭调试工具,可以设置 config/debugbar.php;
'enabled' => env('DEBUGBAR_ENABLED', false),
//手工 开启 或 关闭
DebugBar::enable();
DebugBar::disable();

图示 👇

在这里插入图片描述

PHP LARAVEL 模型的预加载

   预加载

  1. 预加载,就是解决关联查询中产生的 N+1 次查询带来的资源消耗
  2. 我们要获取所有书籍的作者 (或拥有者),普通查询方案如下:
//获取所有书籍列表
$books = Book::all();
//遍历每一本书
foreach ($books as $book) {
//每一本书的关联用户的姓名
DebugBar::info($book->user->username);
}
PS:通过调试器 Debugbar 中 SQL 语句的分析,发现包含十多条 SQL 语句;
PS:原因是关联查询时,每遍历一次就会执行一遍 SQL 语句,导致性能欠佳;
PS:所谓 N+1 条,就是起初获取全部数据的 1 条和,遍历的 N 条;
  1. 使用 with()关键字,进行预载入设置,提前将 SQL 整合;
//with 关键字预载入
$books = Book::with('user')->get();
foreach ($books as $book) {
DebugBar::info($book->user->username);
}
PS:此时的 SQL 执行数目为:1+1 条;也支持数组多个关联 with['book','prifile']PS:预加载也可以设置显示的列;
//预载入设置指定的列
$books = Book::with('user:id,username')->get();
  1. 如果每次都必须使用预载入进行关联查询,可以在模型中定义;
protected $with = ['user'];
PS:此时就可以像最初那样写代码,而不需要使用 with()方法了;
  1. 为了演示方便,暂时取消模型$with,再看下预载入结合筛选;
$books = Book::with(['user' => function ($query) {
$query->where('id', 19);
}])->get();
PS:预载入筛选不可以使用 limit、take 方法;
  1. 有时,可能会产生逻辑判断是否查询数据,但预加载会提前关联执行;
  2. 这样,会导致资源性能的浪费,这时,可以采用延迟预载入;
$books = Book::all();
if (true) {
    $books = $books->load('user'); //load(['user' => function () {}])
    foreach ($books as $book) {
        DebugBar::info($book->user->username);
    }
}
  1. 使用 loadCount()方法,可以实现延迟关联统计;
$users = User::all();
if (true) {
	return $users->loadCount('book');
}

最后

以上是个人学习 THINKPHP 的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Re45:读论文 GPT-1 Improving Language Understanding by Generative Pre-Training

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Improving Language Understanding by Generative Pre-Training 论文下载地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 本文是2018年OpenAI的工作&#xff0c…

智慧班牌全套源代码 智慧班牌人脸识别云平台源码

智慧校园云平台电子班牌系统源码,系统架构:Javavue2springbootMySQL elmentuiQuartzjpajwt 智慧校园建设在近年来已经形成主流,不少地区等级的学校都在不同程度地进行校园信息化建设优化,比如把人脸识别门禁应用到校门口、宿舍门口…

网站edge -- 油猴 -> IDM

一、百度网盘限速 未解决 软件:IDM 安装路径: 1.1如果:edge 出问题打不开其他网站, 解决方法: 以管理员的身份,右击载这个软件,就好了 1.2使用这个软件 应该是右击这个软件 以管理员的身…

VMware设置,降低Win11系统内存的使用

编辑虚拟机设置 设置处理器和内存,建议内存不大于4096 设置常规,选择客户机操作系统为Windows 高级选项,设置固件类型为UEFI

K8S 基础概念学习

1.K8S 通过Deployment 实现滚动发布,比如左边的ReplicatSet 的 pod 中 是V1版本的镜像,Deployment通过 再启动一个 ReplicatSet 中启动 pod中 镜像就是V2 2.每个pod 中都有一个pause 容器,他会连接本pod中的其他容器,实现互通。p…

Java 几个基本数据类型长度

对 Java 来说,我们通常会有下面几个基本数据类型。 需要了解的一个定义是,一个字节(byte) 是 8 位(Bit)。 针对 Java 的所有数据类型,最小的是 1 个字节,最多的是 8 个字节 数据长…

【Windows操作系统】Windows10升级时报VirtualBox错误导致升级失败

【背景】 明明已经卸载了VirtualBox,但是Win10升级时依然报错:VirtualBox阻止升级导致升级失败。 【分析】 说明电脑中存在VirtualBox残余,但是这些参与虽然能被升级程序检测到却不能在卸载VirtualBox时自动关联删除,需要找到…

Python实现Word、Excel、PPT批量转为PDF

今天看见了一个有意思的脚本Python批量实现Word、EXCLE、PPT转PDF文件。 因为我平时word用的比较的多,所以深有体会,具体怎么实现的我们就不讨论了,因为这个去学了也没什么提升,不然也不会当作脚本了。这里我将其放入了pyzjr库中…

如何移除 ONLYOFFICE 中的插件

如果您需要移除 ONLYOFFICE 编辑器中的某个甚至所有的插件,本文会向您介绍如何操作。如要详细了解,请阅读本文。 为什么会想移除插件 ONLYOFFICE 用户想知道如何删除插件,隐私问题是主要原因之一。有些插件(如照片编辑器&#xf…

C++零碎记录(四)

6. 深拷贝与浅拷贝 ① 浅拷贝:简单的赋值拷贝操作。 ② 深拷贝:在堆区重新申请空间,进行拷贝操作。 ③ 浅拷贝,如下图所示,带来的问题就是堆区的内存重复释放。 ④ 深拷贝,如下图所示,在堆区…

Cyber RT学习笔记---7、Component组件认知与实践

7、Component组件认知与实践 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分,还请大家多多指出。 课程地址: https://apollo.baidu.com/community/course/outline/329?activeId10200 更多还请参考: [1] Apollo星火计划学习笔记——第…

Latex引用总结-图片、公式、表格、参考文献

所有的引用思路都一样,在定义的时候加一个标签,引用的时候填那个标签即可。 其中图片、公式、表格的引用代码一摸一样,都是label{}加ref{},参考文献稍不同。 前提引用包: \usepackage{hyperref} \hypersetup{hypert…

CSS中如何实现文字跑马灯效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跑马灯⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋…

mac常见问题(三) macbook键盘溅上水怎么办?

多朋友在使用mac的时候难免会发生一些小意外,例如说本期要为大家说的macbook键盘溅上水或者其他的液体怎么办?不清楚的同学赶快get这项技能吧! 如果你不小心给你的MacBook键盘上溅了水或者其他液体,你需要超级快的把表面的液体清理…

远程访问公司局域网怎么设置

远程访问公司 LAN(局域网)计算机需要设置安全的远程访问方法,以确保数据的机密性和完整性。远程访问公司局域网计算机的步骤如下: 1、获得许可 确保您拥有远程访问公司 LAN 资源所需的权限和授权。这可能需要 IT 或网络管理员的…

SpringMVC基础入门及工作流程---全方面详细介绍

一,SpringMVC概念 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简…

【Seata】02 - Seata AT 模式 Demo 调用流程分析

文章目录 前言参考目录版本说明测试 Demo0、Demo XA / AT 模式切换1、模块说明2、调用逻辑说明3、分析流程说明4、注意事项 Seata AT 模式 Commit 调用流程分析1、调用流程图2、全局事务开启 Global Begin3、分支注册4、UndoLog5、全局事务提交 Commit6、分支提交处理 Seata AT…

KC705开发板——MGT IBERT测试记录

本文介绍使用KC705开发板进行MGT的IBERT测试。 KC705开发板 KC705开发板的图片如下图所示。FPGA芯片型号为XC7K325T-2FFG900C。 MGT MGT是 Multi-Gigabit Transceiver的缩写,是Multi-Gigabit Serializer/Deserializer (SERDES)的别称。MGT包含GTP、GTX、GTH、G…

通过 Keycloak 结合 OAuth2.0协议进行 Amazon API Gateway 鉴权

1. 简介 本文介绍了如何通过 Keycloak,并结合 Amazon API Gateway 内置的授权功能,完成对 Amazon 资源请求的鉴权过程。API Gateway 帮助开发者安全的的创建、发布、维护并管理 API 的访问。在中国区,由于Cognito 仍未上线,因此使…