讨论一下,这个需求有没有更优雅的写法

需求#

查询推荐文章,固定返回 6 条数据,如果没有推荐文章或者不足 6 条数据,则用最新发布的文章补充到 6 条(PS: 推荐文章的判断条件是文章表有 recommend_right_at 字段标识是否是推荐文章,类型是 timestap)。

实现逻辑#

先用 whereNotNull 查询推荐文章,有 6 就直接返回,不足 6 条就再重新生成一个查询去查不是推荐的文章,最后合并返回。

public function recommended(Request $request)
{
$cate = $request->input('category_id');
$query = Info::query()
         ->where('status',Info::APPROVED)
         ->with(['category','category_two','category_three'])
         ->when($cate,function (Builder $builder) use($cate){
             return $builder->where('category_id',$cate);
         });
        $new_query = clone $query;
        $recommend_infos = $new_query
            ->whereNotNull('recommend_right_at')
            ->limit(6)
            ->latest('recommend_right_at')
            ->get();
        if(count($recommend_infos) >= 6){
           $data = $recommend_infos;
        }else{
            $infos = $query
                ->whereNull('recommend_right_at')
                ->latest('created_at')
                ->limit(6-count($recommend_infos))
                ->get();
            $data = collect(array_merge($infos->toArray(),$recommend_infos->toArray()));
        }
        return Response()->json($data)->setStatusCode(200);
    }

我感觉这些写有点繁琐呢,请问有没有更好的写法?

心之所向,素履以往。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

按照 recommend_right_at 排序再按照 created_at 排序 一个查询就可以了

4年前 评论
lmdfx (楼主) 4年前
讨论数量: 2

按照 recommend_right_at 排序再按照 created_at 排序 一个查询就可以了

4年前 评论
lmdfx (楼主) 4年前

按照 recommend_right_at 排序再按照 created_at 排序 一个查询就可以了

4年前 评论
lmdfx (楼主) 4年前

这样应该可以

$query
    ->limit(6)
    ->orderBy('recommend_right_at', 'desc')
    ->orderBy('created_at', 'desc')
    ->get();
4年前 评论