一、需求
- 前端页面(列表显示订单数据),有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;
}
}