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

需求

查询推荐文章,固定返回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);
    }

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

心之所向,素履以往。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

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

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

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

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

这样应该可以

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!