根据用户名查询订单

目录

  • 一、需求
  • 二、表部分字段
  • 三、思路
  • 四、代码

一、需求

  • 前端页面(列表显示订单数据),有2个输入框:请输入订单号,请输入用户名,根据输入的内容获取到订单,显示在表格(分页)。

二、表部分字段

  • 订单表:id,order_sn,user_id,create_time,…
  • 用户表:id,username,…

三、思路

由表设计可知,用户名没存在订单表,只有通过user_id来查,所以当输入用户名后。根据用户名在用户表得到id,根据用户表的id,去IN查询订单表的user_id

别说:为什么不冗余username字段到order表?我这里只是针对这类的案例给个思路

  • 输入订单号时:直接在订单表模糊查询即可
  • 输入用户名时:根据用户名在用户表得到id,根据用户表的id,去IN查询订单表的user_id

四、代码



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;
    }
}

你可能感兴趣的:(#,PHP,PHP综合,php,列表,模糊查询)