问题描述:目前有用户表,文章表,文章评论表,收藏表。我需要获我的收藏文章列表(可以被搜索,通过分类,文章标题等),通过收藏预加载with文章表,文章评论表,文章用户表
解决办法:通过whereHas限定要查询的文章字段条件,然后进行预加载with获取数据
【php|Laravel使用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 = https://www.it610.com/article/[]; $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();
转载于:https://www.cnblogs.com/xiaqiuchu/p/11508426.html
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...