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();

 

转载于:https://www.cnblogs.com/xiaqiuchu/p/11508426.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue Router中,可以使用beforeRouteEnter钩子来加载数据。beforeRouteEnter是一个组件级钩子,它在组件实例被创建之前调用。它可以帮助我们在路由切换之前获取所需的数据。 在beforeRouteEnter钩子中,我们可以通过next函数来传递一个回调函数,在回调函数中获取数据并将其传递给组件。这样,在组件实例被创建之前,我们就可以获取到所需的数据了。 下面是一个使用beforeRouteEnter钩子来加载数据的示例: ``` beforeRouteEnter (to, from, next) { // 在这里获取数据,并将其传递给next函数的回调函数 fetchData((data) => { next(vm => { // 将获取到的数据传递给组件实例 vm.data = data }) }) } ``` 在上面的示例中,fetchData是一个用于获取数据的异步函数。在获取到数据后,我们通过next函数的回调函数将数据传递给组件实例的data属性。 通过使用beforeRouteEnter钩子,我们可以在组件加载之前获取到所需的数据,确保组件在渲染之前已经具备了必要的数据。这样可以提升用户体验,避免页面的闪烁或加载过程中的空白内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue.js笔试题解决业务中常见问题](https://blog.csdn.net/qq_36232611/article/details/112505614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值