需求
以上活动列表需要关联活动分类表,商品表并对应进行条件查询。针对不同的条件如何优雅的实现性能相对较佳的查询呢
比如我们要从活动表里模糊搜索活动名称、从产品表里模糊搜索产品名称、根据活动分类筛选等
代码
我们在service 层实现
public function getList(array $params)
{
//活动子查询
$actSub = $this->actRepo->where('store_id', $this->storeId);
//商品子查询
$goodsSub = $this->goodsRepo->select(['goods_id', 'goods_name']);
//活动名称
if (!empty($params['title'] ?? '')) {
$actSub->where('title', 'like', '%' . $params['title'] . '%');
}
//商品名称
if (!empty($params['goods_name'] ?? '')) {
$goodsSub->where('goods_name', 'like', '%' . $params['goods_name'] . '%');
}
//分类
if (!empty($params['cate_id'] ?? '')) {
$actSub->where('cate_id', $params['cate_id']);
}
//状态
if (isset($params['status'])) {
$actSub ->where('status', $params['status']);
}
//join 关联两个子查询
$query = $this->actRepo->select('activity.*', 'goods.goods_name')
->fromSub($actSub, 'activity');
$query->joinSub($goodsSub, 'goods', function ($join) {
$join->on('activity.goods_id', '=', 'goods.goods_id');
});
//倒序
//最后发布时间排序
if (isset($params['order_publish_time'])) {
$sort = strtolower($params['order_publish_time']) == 'desc' ? SORT_DESC : SORT_ASC;
$query->addOrderBy(['goods.publish_time' => $sort]);
}
//活动创建时间排序
if (isset($params['order_act_created'])) {
$sort = strtolower($params['order_act_created']) == 'desc' ? SORT_DESC : SORT_ASC;
$query->addOrderBy(['activity.created_at' => $sort]);
}
$query->orderBy('activity.id', 'desc');
$acts = PaginationHelper::appLists($query);
return $acts;
}
我们的思路是通过添加子查询的形式,每张表都建立一个子查询,这样字段可选并且性能较优,并且能优雅的插入对应的条件查询与排序需求
小结
当然实现这种列表对大家来说是小菜一碟,或许大家早就知道这种写法了,见笑啦~,这种列表我也是原生的写过,但是用框架自带子查询之前还没想过呢