@作者 : 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开发过程更快速、简单和愉悦。
-
MVC架构模式:Laravel采用了MVC(Model-View-Controller)架构模,将应用程序的逻辑分为不同的层,提高了代码的可维护性和可测试性。
-
简洁的语法和表达力:Laravel框架支持具有简洁而表达力的语法,使得编写清晰、易读、易维护的代码成为可能。
-
路由系统:它提供了一个强大且灵活的路由系统,通过简单的配置和代码即可定义Web应用程序的路由规则,实现URL到控制器的映射。
-
数据库抽象层:Laravel提供了一个简便的数据库抽象层,支持多种数据库系统,并通过Eloquent ORM提供了一种优雅的方法来与数据库进行交互。
-
权限和认证系统:Laravel提供了内置的身份验证和授权功能,使得实现用户身份验证、访问控制和权限管理变得简单和便捷。
-
缓存系统:Laravel支持多种缓存后端,包括文件、数据库、Memcached和Redis等,让你可以轻松地实现缓存数据,提升应用程序的性能。
-
强大的扩展性:Laravel通过Composer和Packagist等工具提供了丰富的扩展包生态系统,可以快速集成各种功能组件和第三方库,加快开发进程。
-
测试支持: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();
- 使用 has()方法,可以查询某些条件下的关联查询数据;
//获取存在关联书籍的用户列表(言下之意:至少一本书)
$users = User::has('book')->get();
return $users;
//获取存在关联书籍(并超过 3 条)的用户列表
$users = User::has('book','>=', 3)->get();
return $users;
- 使用 whereHas()方法,创建闭包查询;
//whereHas 闭包用法
$users = User::whereHas('book', function ($query) {
//这里$query 是 book 表,通过 user_id 查询,返回 user 表数据
$query->where('user_id', 19);
})->get();
return $users;
- 使用 doesntHave()方法,即 has()的反向操作;
//获取不存在关联书籍的用户列表,闭包用法:whereDoesntHave()
$users = User::doesntHave('book')->get();
return $users;
- 使用 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 调试器
安装使用
- 通过 composer 在项目中安装 Debugbar,命令如下:
安装调用器 👉 composer require barryvdh/laravel-debugbar
- 生成一个配置文件,给用户配置,可以根据需求进行配置;
php artisan vendor:publish --provider=“Barryvdh\Debugbar\ServiceProvider”
- 刷新页面,即可看到底部的调试工具,message 信息还需要引入;
use Barryvdh\Debugbar\Facade as DebugBar;
DebugBar::info('信息!');
- 如果想要关闭调试工具,可以设置 config/debugbar.php;
'enabled' => env('DEBUGBAR_ENABLED', false),
//手工 开启 或 关闭
DebugBar::enable();
DebugBar::disable();
图示 👇
PHP LARAVEL 模型的预加载
预加载
- 预加载,就是解决关联查询中产生的 N+1 次查询带来的资源消耗
- 我们要获取所有书籍的作者 (或拥有者),普通查询方案如下:
//获取所有书籍列表
$books = Book::all();
//遍历每一本书
foreach ($books as $book) {
//每一本书的关联用户的姓名
DebugBar::info($book->user->username);
}
PS:通过调试器 Debugbar 中 SQL 语句的分析,发现包含十多条 SQL 语句;
PS:原因是关联查询时,每遍历一次就会执行一遍 SQL 语句,导致性能欠佳;
PS:所谓 N+1 条,就是起初获取全部数据的 1 条和,遍历的 N 条;
- 使用 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();
- 如果每次都必须使用预载入进行关联查询,可以在模型中定义;
protected $with = ['user'];
PS:此时就可以像最初那样写代码,而不需要使用 with()方法了;
- 为了演示方便,暂时取消模型$with,再看下预载入结合筛选;
$books = Book::with(['user' => function ($query) {
$query->where('id', 19);
}])->get();
PS:预载入筛选不可以使用 limit、take 方法;
- 有时,可能会产生逻辑判断是否查询数据,但预加载会提前关联执行;
- 这样,会导致资源性能的浪费,这时,可以采用延迟预载入;
$books = Book::all();
if (true) {
$books = $books->load('user'); //load(['user' => function () {}])
foreach ($books as $book) {
DebugBar::info($book->user->username);
}
}
- 使用 loadCount()方法,可以实现延迟关联统计;
$users = User::all();
if (true) {
return $users->loadCount('book');
}
最后
以上是个人学习 THINKPHP 的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波