laravel中with()方法,has()方法和whereHas()方法的区别

with()#

with()方法是用作“渴求式加载”的,那主要意味着,laravel将会伴随着主要模型预加载出确切的的关联关系。这就对那些如果你想加在一个模型的所有关联关系非常有帮助。因为“渴求式加载”缓解了1+N的查询问题,仅需1+1次查询就能解决问题,对查询速度有了质的提升。

例如:

user > hasMany > post

Copy Highlighter-hljs
$users = User::with('posts')->get(); foreach($users as $user){ $users->posts; // posts已经被加载了,没有增加DB查询 }

has()#

has()方法是基于关联关系去过滤模型的查询结果,所以它的作用和where条件非常相似。如果你只使用has('post'),这表示你只想得到这个模型,这个模型的至少存在一个post的关联关系。

例如:

user > hasMany > post

Copy Highlighter-hljs
//User至少有一条post的关联关系 $users = User::has('post')->get();

获取至少有一条post的User数据

你还可以使用”.“来构造嵌套has语句。

例如:

user > hasMany > post

Copy Highlighter-hljs
$user = User::has('post.votes', ‘>’, '3')->get();

whereHas()#

whereHas()方法的原理基本和has()方法相同,但是他允许你自己添加对这个模型的过滤条件。

例如:

user > hasMany > post

Copy Highlighter-hljs
$users = User::whereHas('posts', function($q){ $q->where('created_at', '>=', '2020-11-29'); })->get(); // 只返回用户的post记录在2020年11月29之后的数据
posted @   caibaotimes  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
CONTENTS