laravel根据表单数据连表查询 有什么更加优雅的方式吗?

用laravel新人,做一个后台订单表单查询的操作,查询的字段可能跨了多个表,想问一下大佬,除了以下这种方式,还有什么更好的方式么?

$res = $this->model->select('shop_order_store.id')->where('storeId', $where['storeId'])
            ->leftJoin('shop_order_abnormal as soa', 'shop_order_store.id', '=', 'soa.orderStoreId')
            // 订单号查询
            ->when(isset($where['orderSn']) ? $where['orderSn'] : '', function ($query, $orderSn) {
                $query->leftJoin('shop_order as so', 'shop_order_store.orderId', '=', 'so.id')
                    ->where('so.orderSn', 'like', '%' .  $orderSn . '%');
            })
            // 手机号
            ->when(isset($where['phone']) ? $where['phone'] : '', function ($query, $phone) {
                $query->leftJoin('shop_order_receiver as soc', 'shop_order_store.orderId', '=', 'soc.orderId')
                    ->where('soc.phone', 'like', '%' . $phone . '%');
            })
            // 订单状态查询
            ->when($where['status'], function ($query, $status) {
                if (is_array($status)) {
                    $query->whereIn('shop_order_store.status', $status);
                } else {
                    $query->where('shop_order_store.status', $status);
                }
            })
            // 原订单状态查询
            ->when(isset($where['orderLastStatus']) ? $where['orderLastStatus'] : '', function ($query, $status) {
                $query->where('soa.orderLastStatus', $status);
            })
            ->when(isset($where['createTimeGreater']) ? $where['createTimeGreater'] : '', function ($query, $timeGreater) {
                $query->where('soa.datetime', '>=', $timeGreater);
            })
            ->when(isset($where['createTimeLess']) ? $where['createTimeLess'] : '', function ($query, $timeLess) {
                $query->where('soa.datetime', '<', $timeLess);
            })
            // 消费类型查询
            ->when(isset($where['spendType']) ? $where['spendType'] : '' , function ($query, $spendType) {
                $query->where('shop_order_store.spendType', $spendType);
            })
            ->groupBy('shop_order_store.id')
            ->orderBy('shop_order_store.id', 'desc')
            // 分页
            ->offset($where['limit'] * ($where['page'] - 1))->limit($where['limit']);

        $searchFields = ['so.id as orderId', 'shop_order_store.id as orderStoreId', 'shop_order_store.uid', 'so.orderSn', 'so.createTime', 'soc.phone', 'shop_order_store.price', 'shop_order_store.payType', 'shop_order_store.spendType', 'shop_order_store.storeIsAgree', 'shop_order_store.status', 'soa.datetime as applyTime', 'soa.storeIsAgree as applyStatus', 'soa.storeAuditTime as auditTime', 'soc.consignee', 'soa.orderLastStatus as orderStatus'];
        return $this->model->select($searchFields)
            ->leftJoin('shop_order as so', 'shop_order_store.orderId', '=', 'so.id')
            ->leftJoin('shop_order_receiver as soc', 'shop_order_store.orderId', '=', 'soc.orderId')
            ->leftJoin('shop_order_abnormal as soa', 'shop_order_store.id', '=', 'soa.orderStoreId')
            ->joinSub($res, 't', function ($join) {
                $join->on('shop_order_store.id', '=', 't.id');
            })->orderBy('shop_order_store.id', 'desc')
            ->get();

感觉我写的很low,求改进的方法...

阅读 2.1k
1 个回答

下面的代码 代码看起来可能舒服一些

  • 1
 ->when(isset($where['createTimeLess']), function ($query, $timeLess) {
        $query->where('soa.datetime', '<', $timeLess);
    })
  • 2
isset($where['orderLastStatus']) && $where[] =['soa.datetime','<',$timeLess];
$this->model->where($where);// TODO
  • 3
isset($where['orderLastStatus']) && $this->model->where('soa.datetime', '<', $timeLess);// TODO
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题