一、需求
- 前端頁面(列表顯示訂單數據),有2個輸入框:請輸入訂單號,請輸入用戶名,根據輸入的內容獲取到訂單,顯示在表格(分頁)。
二、表部分字段
- 訂單表:id,order_sn,user_id,create_time,…
- 用戶表:id,username,…
三、思路
由表設計可知,用戶名沒存在訂單表,只有通過user_id來查,所以當輸入用戶名後。根據用戶名在用戶表得到id,根據用戶表的id,去IN查詢訂單表的user_id
別說:爲什麼不冗餘username字段到order表?我這裏只是針對這類的案例給個思路
- 輸入訂單號時:直接在訂單表模糊查詢即可
- 輸入用戶名時:根據用戶名在用戶表得到id,根據用戶表的id,去IN查詢訂單表的user_id
四、代碼
<?php
namespace app\index\controller;
class Ablog extends Base
{
/**
* 根據查詢參數返回結果數據
* @param $param ['order_sn' => '1234', 'username' => '張三']
* @param $pager ['page' => 1, 'page_size' => 10]
* @return array
*/
public function lists($param, $pager){
$flag = self::processParam($param);
if (!$flag){ //如果flag爲false,直接返回空數據
return [ 'data' => [], 'count' => 0 ];
}
$orderDao = new OrderDao(); //實例化訂單表
$data = $orderDao->query($param, ['id', 'order_sn', 'user_id', 'create_time'], $pager); //分頁查詢訂單表數據,返回格式 ['data'=>[], 'count'=>0]
if ($data['data']){ //是 $data['data'], 不是 $data
//獲取用戶ID對應的用戶名
$userDao = new UserDao(); //實例化用戶表
$userParam['id'] = ['in', array_column($data['data'], 'user_id')]; //IN查詢user表id字段
$userList = $userDao->queryAll($userParam, ['id', 'username']); //查詢所有數據
$userIdToName = array_column($userList, 'username', 'id'); //數據處理成 [id=>username, id=>username, ...]格式
foreach ($data['data'] as &$value){ //循環處理訂單數據
$value['username'] = !empty($userIdToName[$value['user_id']]) ? $userIdToName[$value['user_id']] : '未知用戶'; //判斷用戶是否存在
$value['create_time'] = date('Y-m-d H:i:s', $value['create_time']); //[ 時間戳 1712312312 ] 轉爲 [ 日期 2024-04-05 18:18:32 ] 格式
}
}
return $data;
}
/**
* 處理參數
* @param $param 待處理的參數
* @return bool 查詢的數據是否存在:默認存在
*/
public function processParam(&$param){
$flag = true;
if (!empty($param['username'])){ //如果輸入了用戶名
$userDao = new UserDao(); //實例化用戶數據表
$userParam['username'] = ['like', $param['username']]; //Like模糊查詢user表username字段
$userList = $userDao->queryAll($userParam); //查找所有數據:該用戶是否存在
if (empty($userList)){ //如果不存在,flag設置爲false:lists()方法中直接返回空數據
$flag = false;
}else{ //如果存在,IN查詢order表user_id字段
$param['user_id'] = ['in', array_column($userList, 'id')]; //IN查詢order表user_id字段
unset($param['username']); //刪除order表中不存在的username字段
//tips:unset()支持一次刪除多個變量
//unset($a, $b, $c);
}
}
if (!empty($param['order_sn'])){ //如果輸入了訂單號
$param['order_sn'] = ['like', $param['order_sn']];
}
return $flag;
}
}