Laravel 在 with 查询中只查询个别字段

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

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

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

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

在 Model 基类中定义一个范围查询(或者使用 Trait)

class BaseModel extends \Eloquent{
    public function scopeWithOnly($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)->withOnly(‘user‘, [‘username‘])->get();

note:with查询结果空是因为你的查询字段不包含你的关联字段, 就比如 拿ID关联的话, 你就得 select() 里必须包含ID, 要么就返回空

转载自:https://laravel-china.org/topics/1220/laravel-queries-only-individual-fields-in-with-queries

时间: 2024-08-03 20:38:19

Laravel 在 with 查询中只查询个别字段的相关文章

SQL多表查询中的分页,字段组合综合实例解析

原文:http://www.jb51.net/article/28753.htm http://xuzhihong1987.blog.163.com/blog/static/26731587200981744956366/ 要实现的SQL查询很原始: 要求从第一个表进行查询得到第二个表格式的数据,上网查询之后竟然能写出下面的SQL: 复制代码代码如下: select * from userino SELECT * FROM( SELECT DISTINCT userpart FROM useri

Hibernate高效查询,只查询部分/指定字段

公司使用 [java] view plain copy print? DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PeBulletin.class); detachedCriteria.createAlias("enumConstByFlagIsvalid", "enumConstByFlagIsvalid"); detachedCriteria.createCriteria("

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询 - Darly

–COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列.行计数(count): 标准格式 SELECT COUNT(<计数规范>) FROM <表名> 其中,计数规范包括: - * :计数所有选择的行,包括NULL值: - ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL: - DISTINCT 列名:计数指定列的唯一非空值行. 例,计算班里共有多少学生:

子查询、集合查询

子查询.集合查询 1.子查询 1.1.子查询简介 1.2.WITH 子查询 2.集合查询 2.1.UNION 和 UNION ALL 2.2.MINUS 2.3.INTERSECT 2.4.集合运算与 ORDER BY 3.DISTINCT 子句 3.1.普通用法 3.2.做聚合函数的参数 4.总结 1.子查询 1.1.子查询简介 子查询是一个嵌套在 SELECT.INSERT.UPDATE 或 DELETE 语句或其他子查询中的查询.任何允许使用表达式的地方都可以使用子查询,换句话说,子查询几

sql查询语句学习,多表查询和子查询以及连接查询

一.交叉连接查询 这种查询方式基本不会使用,原因就是这种查询方式得到的是两个表的乘积(笛卡儿集) 语法就是select * from a,b: 二.内连接查询,可以有效的去除笛卡尔集现象 内连接查询分为两类: 隐式内连接 select * from A,B where 条件 隐式连接使用别名:select * from A 别名1,B 别名2 where 别名1.xx=别名2.xx: 显示内连接 select * from A inner join B on 条件 (inner可以省略) 显示连

HANA Studio中修改默认查询结果只显示1000行

成员变量 //由该流的创建者提供的 byte 数组. protected byte buf[]; //要从输入流缓冲区中读取的下一个字符的索引. protected int pos; //流中当前的标记位置. protected int mark = 0; //比输入流缓冲区中最后一个有效字符的索引大一的索引. protected int count; 构造参数 提供一个byte数组 public ByteArrayInputStream(byte buf[]) { this.buf = buf

在windows操作系统中,查询端口占用和清除端口占用的程序

一.在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b或用 1.查询端口占用的进程ID 点击"开始"-->"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:netstat -a -n  各个端口占用netstat -ano   各个端口占用和进程PID          netstat -aon | findstr "80"      C:\Us

sql连接查询中on筛选与where筛选的区别

sql连接查询中on筛选与where筛选的区别 sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能. 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏. 就拿比普通增删查改稍微复杂一个层次的连接查询来说, 盲目使用, 也会出现意料之外的危险结果,导致程序出现莫名其妙的BUG. 在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了,  在我们编写查询的时候, 筛选条件的放置不管是在o

SQL Server中的查询

      本博文简单介绍一下SQL Server中常用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCommand类的方法之一,执行查询,并返回查询所返回的结果集中的第一行第一列.        class Program { static void Main(string[] args) { string strCon = "Data Source=192.168.24.193;Initial Cat