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();
复制代码

 

posted @   夏秋初  阅读(6867)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示