在使用 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();

最新文章

  1. Xamarin 与VS2015RC(xamarin 3.11.450) 报空指针错误。
  2. Thymeleaf+SpringMVC,如何从模板中获取数据
  3. Android Activity/Service/Broadcaster三大组件之间互相调用
  4. survival analysis 生存分析与R 语言示例 入门篇
  5. 暴力 hihoCoder 1251 Today Is a Rainy Day (15北京C)
  6. jquey ajax 无刷新提交form
  7. 2016022609 - redis哈希命令集合
  8. H5 应用程序返回button的js代码设计,设计仿stack
  9. thinkphp 分组、页面跳转与ajax
  10. 基于visual Studio2013解决C语言竞赛题之0904文件排序
  11. Microsoft Visual C++运行库合集下载(静默安装)
  12. deinstall oracle 11g on linux
  13. JavScript--表单提交
  14. Unity3D UGUI 自动调节大小
  15. 使用Nodejs在Windows上调用CMD命令
  16. Python 通用爬虫 和讯博客 scrapy
  17. 学习Acegi应用到实际项目中(9)- 实现FilterInvocationDefinition
  18. Linux运维之如何查看目录被哪些进程所占用,lsof命令、fuser命令
  19. rfid 125khz
  20. 【LeetCode OJ】Search Insert Position

热门文章

  1. u3d中 rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight()错误的原因及解决方法
  2. ScrollView子控件高度设置无效
  3. 深入浅出:全面理解SQL Server权限体系
  4. 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
  5. Objective-C 语法之 Debug 表达式
  6. Objective-C语法之扩展(Extension)的使用
  7. jquery获取data-xxx自定义属性的值遇到的问题
  8. 土办法 填充NAS空间
  9. tomcat和nginx的使用
  10. 2018年7月份,python上传自己的包库到pypi官网的方法