laravel with 渴求式加载指定字段

在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的。

这时候我们可以使用下面的技巧在使用 with 时只查询目标关联的部分字段:

$topics = Topic::limit(2)->with([‘user‘=>function($query){
   $query->select(‘id‘,‘username‘);
}])->get();

但是每次查询都写得这么繁琐真的好么?不如利用 Laravel 的范围查询将其封装起来:

在 Model 基类中定义一个范围查询

class BaseModel extends \Eloquent{
    public function scopeWithCertain($query, $relation, Array $columns)
    {
        return $query->with([$relation => function ($query) use ($columns){
            $query->select(array_merge([‘id‘], $columns));
        }]);
    }
}

在我们普通的 Model 类都继承基类:

class Topic extends BaseModel{
    public function user()
    {
        return $this->belongsTo(‘User‘);
    }
}

然后使用就很方便了:

$topics = Topic::limit(2)->withCertain(‘user‘, [‘username‘])->get();
时间: 2024-10-14 00:06:34

laravel with 渴求式加载指定字段的相关文章

laravel 嵌套的渴求式加载

今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal_id.field_type_id: 场地类型表C的字段:id.display_name等等: Appeal模型中: public function appeal_field_type() { return $this->hasMany('App\Models\AppealFieldType');}

【EF学习笔记08】----------加载关联表的数据 显式加载

显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合==========="); using (var db = new Entities()) { var query = from v in db.Classes where v.ClassName == "机电10501" select v; var cls = query.Single(); db.Ent

《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经加载到上下文中,另外你想使用Code-First来管理数据访问. 解决方案 假设你有如图5-26所示的概念模型 图5-26 一个包含projects,managers和contractors的模型 在Visual Studio中添加一个名为Recipe11的控制台应用,并确保引用了实体框架6的库,NuGet可

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存. 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面.这是静态链接库的一个弊端. 动态链接库有两种加载方式:隐式加载和显示加载. 隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存.隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受. 显式加载又叫运行

背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebView) 加载指定 HttpMethod 的请求 自定义请求的 http header app 与 js 的交互 示例1.演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http headerWebApi/Controllers/WebViewPostController.cs /* * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自

[转] Entity Framework 无法加载指定的元数据资源。

Entity Framework 发布以来,本人也一直在用,深感好用,忍不住地要感谢微软啊!由于项目结构创建完成后,没怎么改动过,所以一直没出题过问题,可最近由于改动了下命名空间,问题来了,正是标题中的"无法加载指定的元数据资源".经过百般调试终于解决了,写下做为记录. 先详细说下问题出现的原因: 自从项目创建以来 Authorize.edmx 模型文件一直放在 Model文件夹下 项目一直调试运行,没有出现过错误,最近因项目需要将Model 更名为Models问题随之而来,在调用实体

java动态加载指定的类或者jar包反射调用其方法

序言 有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高.模式中的代理模式就用到java的这一机制.下边就让我们通过代码来看看如何实现此功能. 代码详细 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoad

Entity FrameWork异常:无法加载指定的元数据资源

今天在EF开发的过程中报出这样的错误:Entity FrameWork异常:无法加载指定的元数据资源 在网上看了一些帖子,一般说的解决方法都比较繁琐. 我是这么解决的: 首先我先说下我的文件结构层次:存在web类库和Dal类库,而数据的edmx是在DAL类库中. 我猜想可能是两个配置文件不同造成的,就把dal中的appconfig中的连接键复制到web的webconfig中,并删除掉原来的,果然就不报错了,但又出现了另一个错误:基础提供程序在 Open 上失败 然后,我把web中的webconf

ClassLoader加载指定的类需注意六个细节或报ClassNotFundEception异常总结

项目中,加载指定的类反射调用方法一直报类找不到,经过数百次的测试,对这种问题有了一个重新的认识,特总结.记录.分享如下: 1.路径中尽可能用"/"或者File.separator()而非"\\",路径中"\"是windows平台的,linux平台中是"/",java中也是用"/"作为路径的,所以为了跨平台和更规范,建议采用前者 2.在当前的环境中获取绝对路径后,尽可能的replace("\\&qu