hyper子查询优雅实现多表关联字段查询及排序

需求

在这里插入图片描述
以上活动列表需要关联活动分类表,商品表并对应进行条件查询。针对不同的条件如何优雅的实现性能相对较佳的查询呢

比如我们要从活动表里模糊搜索活动名称、从产品表里模糊搜索产品名称、根据活动分类筛选等

代码

我们在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;
    }

我们的思路是通过添加子查询的形式,每张表都建立一个子查询,这样字段可选并且性能较优,并且能优雅的插入对应的条件查询与排序需求

小结

当然实现这种列表对大家来说是小菜一碟,或许大家早就知道这种写法了,见笑啦~,这种列表我也是原生的写过,但是用框架自带子查询之前还没想过呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值