问答

求大佬看看关联表的查询,可以怎么优化优化?

作者:admin 2021-07-22 我要评论

public function index(Request $request) { $res = Article::orderBy('id', 'desc')-where('is_delete', 0)-where(function ($query) use ($request) { if (!em...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
public function index(Request $request)
    {
        $res = Article::orderBy('id', 'desc')->where('is_delete', 0)->where(function ($query) use ($request) {
            if (!empty($request->time_start) && !empty($request->time_end)) {
                $query->where('created_at', '>=', $request->time_start)
                    ->where('created_at', '<=', $request->time_end);
            }
            if (!empty($request->keyword)) {
                $query->where('title', 'like', "%{$request->keyword}%")->orWhere('content', 'like', "%{$request->keyword}%");
            }
            if (!empty($request->tag)) {
                $query->where('tag_id', 'like', "%{$request->tag}%");
            }
            if (!empty($request->type)) {
                $query->where('articleType_id', $request->type);
            }
            if (!empty($request->user)) {
                $query->where('user_id', $request->user);
            }
        })->simplePaginate(10);
//        $user_id = session('userInfo')['id'];
        foreach ($res as $k => $v) {
            $v->user = User::find($v->user_id)->first();
            $v->user->headpic = asset($v->user->headpic);
            $v->typename = ArticleType::find($v->articleType_id)->typename;
            $ArticleUp = ArticleUp::select('type')->where('article_id', $v->id)->where('user_id', $v->user_id)->first();
            if ($ArticleUp) {
                $v->is_up = $ArticleUp->type;
            } else {
                $v->is_up = '';
            }
            $save = ArticleSave::where('article_id', $v->id)->where('user_id', $v->user_id)->first();
            if ($save) {
                $v->is_save = true;
            } else {
                $v->is_save = false;
            }
        }
        return DataReturn::ReturnJson('success', $res);
    }

求大佬给优化优化写法,总是感觉这么写不太好,
欢迎指正

###

看了下你写的,变量名称乱七八糟,而且循环获取单个模型变量?推荐看下laravek 预查询,这里你的这种写法我给你稍微优化你看看,修改了部分参数,不要全部复制,明白主题意思即可

        $articles = Article::query()->orderBy('id', 'desc')->where('is_delete', 0)->where(function ($query) use ($request) {
            $time_start = $request->get('time_start');
            $time_end = $request->get('time_end');
            $keyword = $request->get('keyword');
            $tag = $request->get('tag');
            $type = $request->get('type');
            $user = $request->get('user');

            $time_start && $time_end && $query->where('created_at', '>=', $time_start)->where('created_at', '<=', $time_end);
            $keyword && $query->where('title', 'like', "%$keyword%")->orWhere('content', 'like', "%$keyword%");
            $tag && $query->where('tag_id', 'like', "%$tag%");
            $type && $query->where('articleType_id', $type);
            $user && $query->where('user_id', $user);
        })->forPage($request->get('page'), 10)->get()->toArray(); # 这里改成了 forPage , 你自由调整一下改回来即可

        # 获取唯一参数便于whereIn
        $user_ids = array_column($articles, 'user_id');
        $articleType_ids = array_column($articles, 'articleType_id');
        
        # whereIn批量获取检少查询次数
        # keyBy 用于快速通过索引拿到数据信息
        $users = User::query()->whereIn('id', $user_ids)->get(['headpic', 'id'])->keyBy('id')->toArray();
        $articleTypes = ArticleType::query()->whereIn('id', $articleType_ids)->get(['typename', 'id'])->keyBy('id')->toArray();

        foreach ($articles as $index => $article) {
            # 其他语法格式 $article['user_id'] ?? '';
            $user_id = Arr::get($article, 'user_id', '');
            $articleType_id = Arr::get($article, 'articleType_id', '');

            $user = Arr::get($users, $user_id, []);
            $user['headpic'] = Arr::get($user, 'headpic', '');
            $articleType = Arr::get($articleTypes, $articleType_id, []);
            $data = [
                'user' => $user,
                'typename' => $articleType['typename'] ?? ''
            ];

            # !!!下面的就不写了 同理 | 自己差不多写就行!!!!
//            $v->typename = ArticleType::find($v->articleType_id)->typename;
//            $ArticleUp = ArticleUp::select('type')->where('article_id', $v->id)->where('user_id', $v->user_id)->first();
//            if ($ArticleUp) {
//                $v->is_up = $ArticleUp->type;
//            } else {
//                $v->is_up = '';
//            }
//            $save = ArticleSave::where('article_id', $v->id)->where('user_id', $v->user_id)->first();
//            if ($save) {
//                $v->is_save = true;
//            } else {
//                $v->is_save = false;
//            }

            $article = array_merge($article, $data);
        }
        return DataReturn::ReturnJson('success', $article);
    }
###

如果 Article 表的数据量只有几千上万,这样写没有什么不好的。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 求大佬看看关联表的查询,可以怎么优化

    求大佬看看关联表的查询,可以怎么优化

  • react-router 如何往组件注入其他props

    react-router 如何往组件注入其他props

  •  各位,github上下载的应用源码解压后

    各位,github上下载的应用源码解压后

  • Laravel 中遇到一个 toarray 问题,是

    Laravel 中遇到一个 toarray 问题,是

腾讯云代理商
海外云服务器