用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,求改进的方法...
下面的代码 代码看起来
可能
舒服一些