Laravel使用whereHas进行过滤不符合条件的预加载with数据
问题描述:目前有用户表,文章表,文章评论表,收藏表。我需要获我的收藏文章列表(可以被搜索,通过分类,文章标题等),通过收藏预加载with文章表,文章评论表,文章用户表
解决办法:通过whereHas限定要查询的文章字段条件,然后进行预加载with获取数据
案例:
// 获取自己的收藏
public function my(Request $request)
{
$limit = $request->input('limit');
$deviceRegionList = UserModel::where('token', $this->user_token())->firstOrFail()->article_collection()->whereHas('article', function($query){
$request = request();
$article_class_id = $request->article_class_id;
if(!empty($article_class_id)){
$query->where('article_class_id', intval($article_class_id));
}
// 状态
$status = $request->status;
if(!empty($status)){
$query->where('status', intval($status));
}
// 作物
$crop_class_id = $request->crop_class_id;
if(!empty($crop_class_id)){
$query->where('crop_class_id', intval($crop_class_id));
}
// 标题
$title = $request->title;
if(!empty($title)){
$query->where('title', 'like', '%'.$title.'%');
}
})->with('article', 'article.user', 'article.article_class', 'article.crop_class')->orderBy('id','desc')->paginate($limit)->toArray();
$returnData = [];
$returnData['msg'] = "查询成功";
$returnData['count'] = $deviceRegionList['total'];
$returnData['current_page'] = $deviceRegionList['current_page'];
$returnData['data'] = $deviceRegionList['data'];
return success($returnData);
}
Laravel文档:
// 转自:https://laravelacademy.org/post/19533.html
查询存在的关联关系 访问一个模型的记录的时候,你可能希望基于关联关系是否存在来限制查询结果的数目。例如,假设你想要获取所有至少有一个评论的博客文章,要实现这个功能,可以传递关联关系的名称到 has 和 orHas 方法: // 获取所有至少有一条评论的文章...
$posts = App\Post::has('comments')->get(); 你还可以指定操作符和数目来自定义查询: // 获取所有至少有三条评论的文章...
$posts = Post::has('comments', '>=', 3)->get(); 还可以使用”.“来构造嵌套 has 语句,例如,你要获取所有至少有一条评论及投票的文章: // 获取所有至少有一条评论获得投票的文章...
$posts = Post::has('comments.votes')->get(); 如果你需要更强大的功能,可以使用 whereHas 和 orWhereHas 方法将「where」条件放到 has 查询上,这些方法允许你添加自定义条件约束到关联关系条件约束,例如检查一条评论的内容: use Illuminate\Database\Eloquent\Builder; // Retrieve posts with at least one comment containing words like foo%...
$posts = App\Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get(); // Retrieve posts with at least ten comments containing words like foo%...
$posts = App\Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
}, '>=', 10)->get();
Laravel使用whereHas进行过滤不符合条件的预加载with数据的更多相关文章
- laravel框架源码分析(一)自动加载
一.前言 使用php已有好几年,laravel的使用也是有好长时间,但是一直对于框架源码的理解不深,原因很多,归根到底还是php基础不扎实,所以源码看起来也比较吃力.最近有时间,所以开启第5.6遍的框 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- laravel 预加载特定的列
/**订单列表 0 已删除 1执行中 2 已过期 * * @param Request $request * * @return \Illuminate\Contracts\View\Factory| ...
- laravel 关联中的预加载
预加载 当作为属性访问 Eloquent 关联时,关联数据是「懒加载」的.意味着在你第一次访问该属性时,才会加载关联数据.不过,是当你查询父模型时,Eloquent 可以「预加载」关联数据.预加载避免 ...
- Laravel技巧:使用load、with预加载 区别
1.使用load $posts = Post::all(); $posts->load('user'); 2.使用with $posts = Post::with('user')->all ...
- 11月26日 用seed,预加载种子文件; Case 条件语句。网址的参数如何传递,; Query--自定义scopes
在seed文件中输入一些预加载的种子job,注意属性和值都要有: ❌错误,我输入contact_email的时候value值是空的,这样不能正确生成. 正确✅: for i in 1..10 do ...
- Laravel关联模型中过滤结果为空的结果集(has和with区别)
首先看代码: $userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){ return $quer ...
- Laravel 执行流程(一)之自动加载
定位 从 public/index.php 定位到 bootstrap/autoload.php 从 bootstrap/autoload.php 定位到 vendor/autoload.php 从 ...
- hbase各种遍历查询shell语句 包含过滤组合条件
import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Li ...
随机推荐
- [JDBC]批量提交插入语句以提高数据插入速度(效率提升不明显)
// Initialize conn&stmt Connection conn=null; Statement stmt=null; ... conn=dataSource.getConnec ...
- LVS集群
集群: 将许多小的,性能较低的服务器做成一个大的性能高的超级服务器 集群分为负载均衡集群,高可用集群,高性能运算集群 LVS体系结构与工作原理描述 LVS集群负载均衡器接受服务的所有入站客户端计算机请 ...
- WebXML部署服务
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...
- 九十五:CMS系统之cms后台模板渲染
定义一个宏,用于渲染static文件的时候,只需要传文件名就可以,上下两个“-”是解决渲染的时候源代码换行的情况 {% macro static(filename) -%} {{ url_for('s ...
- Linux系统管理_主题02 :管好文件(1)_2.2 列出文件和文件属性_chmod_ls
用户(user)是能够获取系统资源的权限的集合.Linux 中的用户可 以分为三类: 1. 根用户(root):具有系统全部权限的用户: 2. 普通用户:其使用系统的权限受到一定限制: 3. 系统 ...
- spark-on-yarn 学习
1. hdfs存文件的时候会把文件切割成block,block分布在不同节点上,目前设置replicate=3,每个block会出现在3个节点上. 2. Spark以RDD概念为中心运行,RDD代表抽 ...
- git合并时忽略某个文件
因为开发现场跟部署的环境不同,有很多ip地址每次都要改来改去;于是开两个分支master(用来保存部署现场的ip)和dev(开发环境的ip),开发功能时在dev分支,然后使用master合并,每个分支 ...
- vue新增属性是否会响应式更新?
原文地址 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官 ...
- C#中的接口和抽象类学习
今天学习了接口和抽象类,但并没有很好的进行整理,所以现在写的时候,脑子里多少有点乱乱的,先从接口开始吧. interface 接口,规定了所有派生类的需要遵循的标准,接口定义了需要做些什么,但是没有具 ...
- mybatis 传递多个查询参数
方法1:顺序传参法 public User selectUser(String name, int deptId); <select id="selectUser" resu ...