IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> thinkPHP6.0入门笔记(五)——数据表字段排序 -> 正文阅读

[PHP知识库]thinkPHP6.0入门笔记(五)——数据表字段排序

thinkPHP6.0实现数据表字段排序

在这里插入图片描述

1.利用order方法简单实现

????一般情况下排序是交给前端来实现的,后端一般主要是实现数据库的增删查改。但是PHP中经常出现order字段,由于后端排序order方法的存在,这样排序实现起来会更加简单,有些时候考虑到前端压力,也会将排序交给后端完成。
????既然是数据排序,少不了获取数据,因此回到app/controller/User.php中找到index方法,在withSearch搜索器中增加create_time方法,加上之前的查询方法得到如下代码:

 public function index(){
        return View::fetch('index',[
            'list'=>UserModel::withSearch(['gender','username','email','create_time'],[
                'gender'=>request()->param('gender'),
                'username'=>request()->param('username'),
                'email'=>request()->param('email'),
                'create_time' => request()->param('create_time')
            ])->paginate([
                'list_rows'=>5,
                'query' => request()->param()
            ])
        ]);
    }

之后在app/model/User.php中增加如下方法:

//时间排序搜素器
    public function searchCreateTimeAttr($query,$value){
        return $value ? $query->order('create_time',$value):'';
    }

在导航栏写入localhost/index.php/user?create_time=desc回车得到如下效果:
在这里插入图片描述
解释:这种方式即为get传参,传递参数create_time=‘desc’给后端,后端通过request()->param()的助手函数得到参数值’desc’,并将该参数传递给后端model的SearchCreateTimeAttr()方法(通过第二个参数$value传递),这样才依次完成搜索和排序过程。
????接下来,我们希望能够实现点击创建时间便能够直接进行排序,修改UI,进入app/View/User/index.html文件中,将"创建时间"一栏改成如下代码:

 <th class="text-center dropup">
      <a href="{:url('/user')} ? create_time={$orderRule}" class="text-secondary order-style dropdown-toggle">创建时间 <span class="caret"></span></a>
 </th>

为了实现实际切换,在fetch中加入参数方式:

  'orderRule' => request()->param('create_time')=='desc'? 'asc':'desc'

2.URL优化排序

????上述方式虽然能够实现排序,但是存在一些问题。比如在跳转到page=3的时候,点击使用时间排序之后默认会跳转到第一页。而在实际情况下,排序是不需要回到第一页的。下面对这种方式进行一波优化。
????首先,由于page本身也占用了参数位,故而考虑使用助手函数request()->url()获取在排序之前的url路径:

 <a href="{:request()->url(true)}?create_time={$orderRule}" class="text-secondary order-style dropdown-toggle">创建时间 <span class="caret"></span></a>

但是,很显然在逻辑上也存在矛盾的地方,比如之前说的能够按照时间正序排序也能够按照时间倒序排序。如果按照这样那么就会出现如下问题:
在这里插入图片描述
暴露两大问题:(1)参数重复;(2)url中的’?‘与’&'有误。


????针对问题上述问题,采取的方式是原生PHP处理url参数,具体实现方式如下:
????为了提高函数的可重用性,在common下新建一个Tool.php,在其中写入如下代码:

<?php
namespace app\common;
 class Tool{
     public static function url($queryString){
         //获取当前路径url
         $urlFull=request()->url(true);
         //检测是否含有参数,没有参数加上?返回,防止将参数转化为数组是undefined报错
         if(!isset(parse_url($urlFull)['query'])){
             return $urlFull.'?';
         }
         //将url转化成数组并提取其中的查询参数
         $query=parse_url($urlFull)['query'];
         //将查询字符串转化成拼接成数组,这个过程能够去除重复参数(后出现的覆盖之前出现的)
         parse_str($query,$urlArr);
         //删除里面的create_time参数,因为之后的create_time是默认会加上的,多余的参数也会被之后覆盖
         unset($urlArr[$queryString]);
         //将数组重新合成url
         $queryAll=http_build_query($urlArr);
         return request()->domain().request()->baseUrl().'?'.$queryAll.'&';
     }
 }

通过字符串转数组,数组拼接字符串能够巧妙地实现去除重复参数,通过isset()函数和unset去除数组字段,能够解决’?‘与’&'问题,直接起飞,最终效果如下:
在这里插入图片描述

在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-05 17:07:16  更:2021-08-05 17:07:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 1:01:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码