Laravel的Eloquent ORM 关联关系中的with用法
转自:https://www.jianshu.com/p/dad1a9d71c94
Laravel的Eloquent ORM提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。这个也是本人比较喜欢Laravel的一大原因,同时Eloquent ORM对于数据表关联提供了较为简单关联管理和使用。
在实际开发中,我们常常会遇到一对多的关联关系,就比如商城来说,一个商品分类会拥有很多个商品,他们的关系如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
/**
* 分类下面的商品
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function goods()
{
return $this->hasMany(Good::class);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Good extends Model
{
/**
* 商品所属分类
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function category()
{
return $this->belongsTo(Category::class);
}
}
查询某个分类之下的商品可用下面的方法:
public function goods($categoryId)
{
$category = Category::find($categoryId);
$goods = $category->goods;
return $goods;
}
是不是很简单且优雅呢!好了,回到正题,如果有这样子的一个需求:需要从同一个接口返回分类和属于该分类的商品。面对这样的一个需求,我写出如下的代码:
public function category($categoryId)
{
$category = Category::with('goods')->find($categoryId);
return $category;
}
这里的with方法会将分类之下的商品一起查询出来,而且不会出现N+1影响性能的问题,看来with方法真的不耐啊。在实际项目中,我们往往不是把全部商品查询出来,比如我们要把分类下面上架的商品查询出来,这又该怎么办呢?这里就引申出with方法的第二种用法了:
public function category($categoryId)
{
$category = Category::with(['goods' => function ($query) {
$query->where('is_sale', true);
}])->find($categoryId);
return $category;
}
这里的with方法可以理解为给分类下面的商品一个条件,符合该$query->where('is_sale', true);
就查询出来,是不是觉得这个with方法特别好用呢!
博 主 :夏秋初
地 址 :https://www.cnblogs.com/xiaqiuchu/articles/11429545.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
地 址 :https://www.cnblogs.com/xiaqiuchu/articles/11429545.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义