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

发布于 2022-09-12 03:09:45 字数 2035 浏览 10 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情绪少女 2022-09-19 03:09:45

看了下你写的,变量名称乱七八糟,而且循环获取单个模型变量?推荐看下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);
    }
疏忽 2022-09-19 03:09:45

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文