用最粗糙的方法,写出了查询简单的商品筛选的 SQL 语句,请问我该如何简化??
下面是我写的查询语句,可愁死我了,功能实现倒是实现了,写的太难受了,重复好多,请问我该如何简化呢,或者该怎么传入变量查询,或者有什么其他方法简化,请举例,或演示部分,谢谢
public function postTreat(Request $request)
{
$_page = $request->input("_page"); //页码
$_path = $request->input("_path"); //第三级 path
$_sortType = $request->input("_sortType"); //综合类别
$_sales = $request->input("_sales"); //销售优先
$_priceSmall = $request->input("_priceSmall"); //最低价
$_priceBig = $request->input("_priceBig"); //最高价
$page=($_page-1)*4;
// 是否有价格区间限制
if(empty($_priceSmall)&&empty($_priceBig)){
// 是否按销量排序
if(empty($_sales)){
// 是否有综合排序 判断综合类别
if($_sortType=="composite" || $_sortType==""){ //综合 或 没有
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->skip($page)
->take(4)
->get();
}else if($_sortType=="price_up"){ //价格最低
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->orderBy('goods_price','asc') // 价格最低
->skip($page)
->take(4)
->get();
}else if($_sortType=="price_down"){ //价格最高
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->orderBy('goods_price','desc') // 价格最高
->skip($page)
->take(4)
->get();
}else if($_sortType=="assess_down"){ // 评价最多
// 只有在走这个区间的时候,才需要关联查询 评价的数量
$data = DB::table('shop_goods')
->leftJoin('shop_assess', 'shop_goods.goods_id', '=', 'shop_assess.assess_gcode')
->selectRaw('shop_goods.*,COUNT(shop_assess.assess_id) as assess_num')
->where('shop_goods.goods_cid',$_path)
->where('shop_goods.goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('shop_goods.goods_state',0) // 0已上架 1已下架
->where('shop_goods.goods_recycle',0) // 0正常 1回收站
->groupBy('shop_goods.goods_id')
->orderBy('assess_num','desc')
->get();
}else if($_sortType=="publish_new"){ //最新发布
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->orderBy('goods_time','desc') // 最新发布
->skip($page)
->take(4)
->get();
}
}else{
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->orderBy('goods_num','desc') // 销售倒序排列
->skip($page)
->take(4)
->get();
}
}else{
// 是否按销量排序
if(empty($_sales)){
// 是否有综合排序 判断综合类别
if($_sortType=="composite" || $_sortType==""){
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->whereBetween('goods_price',[$_priceSmall,$_priceBig]) // 价格区间
->skip($page)
->take(4)
->get();
}else if($_sortType=="price_up"){
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->whereBetween('goods_price',[$_priceSmall,$_priceBig]) // 价格区间
->orderBy('goods_price','asc') // 价格最低
->skip($page)
->take(4)
->get();
}else if($_sortType=="price_down"){
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->whereBetween('goods_price',[$_priceSmall,$_priceBig]) // 价格区间
->orderBy('goods_price','desc') // 价格最高
->skip($page)
->take(4)
->get();
}else if($_sortType=="assess_down"){
$data = DB::table('shop_goods')
->leftJoin('shop_assess', 'shop_goods.goods_id', '=', 'shop_assess.assess_gcode')
->selectRaw('shop_goods.*,COUNT(shop_assess.assess_id) as assess_num') //统计评价的数量
->where('shop_goods.goods_cid',$_path)
->where('shop_goods.goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('shop_goods.goods_state',0) // 0已上架 1已下架
->where('shop_goods.goods_recycle',0) // 0正常 1回收站
->whereBetween('shop_goods.goods_price',[$_priceSmall,$_priceBig]) // 价格区间
->groupBy('shop_goods.goods_id')
->orderBy('assess_num','desc')
->get();
}else if($_sortType=="publish_new"){
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->whereBetween('goods_price',[$_priceSmall,$_priceBig]) // 价格区间
->orderBy('goods_time','desc') // 最新发布
->skip($page)
->take(4)
->get();
}
}else{
$data = DB::table('shop_goods')
->where('goods_cid',$_path)
->where('goods_status',1) // 0未审核 1审核通过 2审核未通过
->where('goods_state',0) // 0已上架 1已下架
->where('goods_recycle',0) // 0正常 1回收站
->whereBetween('goods_price',[$_priceSmall,$_priceBig])
->orderBy('goods_num','desc')
->skip($page)
->take(4)
->get();
}
}
foreach($data as $key => $value){
if($value->goods_num>10000){
$value->goods_num = round(($value->goods_num)/10000,1).'万'; //将销量转换
}
}
return $data;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
代码重复的部分多,那么关键就是找出不重复的地方是什么,然后把重复的地方先弄成一块,再按照不同的条件细分。
比如,你这上面的语句有很多按照$_sortType来判定排序的,自然你可以先用一个参数来存储最基本的查询语句;
然后再根据$_sortType进行条件判断:
大概的思路就是这样。
提供一段更优雅的代码
写一段大概的代码,具体细节你需要再重写一下
顺便发一下 Laravel 技术交流群号:
584453488
补充,
when
和if
是一样的效果,如果没有when
就用if
代替我有个想法,把共用的抽离出来。我看你比较重复的东西有数据库链接实例,where和order 你可以在外面做if else然后组合好where和order,除了那个要链接查询的 其他的直接就可以
或者你有可能是觉得代码写的太多的话,看起来不舒服。你可以把一些处理写在Model层这样的话代码就看起来简洁多了