讨论一下,这个需求有没有更优雅的写法
需求
查询推荐文章,固定返回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);
}
我感觉这些写有点繁琐呢,请问有没有更好的写法?
按照 recommend_right_at 排序再按照 created_at 排序 一个查询就可以了