ThinkPHP(八)数据表:模糊查询

一、增加查询

1.application\index\view\Teacher\index.html

增加如下代码

<!-- 【1】查询 -->
                <div class="col-md-8">
                    <form class="form-inline">
                        <div class="form-group">
                        <!-- 显示查询的姓名 -->
                            <label class="sr-only" for="name">姓名</label>
                            <input name="name" type="text" class="form-control" placeholder="姓名...">
                        </div>
                        <button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i>&nbsp;查询</button>
                    </form>
                </div>

当我们点击查询的时候,又跳回了当前页。form action为空表示提交到当前页
在这里插入图片描述

是的,如果我们只想跳回到当前页,那么在url()函数中,是不需要有任何参数的。url()表示生成当前模块当前控制器当前触发器的链接,没错,在这里,就是我们想要的。

地址栏占查询后变:http://tp5/index.php/index/teacher/index?name=张三

2.改application\index\controller\TeacherController.php

// 【1】获取查询名
            $name=Request::instance()->get('name');
            echo $name;

            $Teacher = new Teacher; 
            // $teachers = $Teacher->select(); //获取所有条数
            
            // 【2】查询数据库
            if(!empty($name)){
                $Teacher->where('name','like','%'.$name.'%');
            }
<?php
namespace app\index\controller;     // 该文件的位于application\index\controller文件夹
use think\Controller;               // 用于与V层进行数据传递
use think\Request;                  // 引用Request
use app\common\model\Teacher;       // 教师模型

/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
class TeacherController extends Controller
{
    public function index()
    {
        try {
            $page_size=5; //0设置每页条数

            // 【1】获取查询名
            $name=Request::instance()->get('name');
            echo $name;

            $Teacher = new Teacher; 
            // $teachers = $Teacher->select(); //获取所有条数
            
            // 【2】查询数据库
            if(!empty($name)){
                $Teacher->where('name','like','%'.$name.'%');
            }
            
            $teachers=$Teacher->paginate($page_size); //1进行分页,每页展示page_size条,代替获取所有条数

            // 向V层传数据 3传入数据到v
            $this->assign('teachers', $teachers);

            // 取回打包后的数据
            $htmls = $this->fetch();

            // 将数据返回给用户
            return $htmls;
        } catch(\think\HttpResponseException\Exception $e){
            throw $e;
            
        }
         catch (\Exception $e) {
            // 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下代码的注释去掉。
            // throw $e;
            return '系统错误' . $e->getMessage();
        }
    }

效果:http://tp5/index.php/index/teacher?name=小七

在这里插入图片描述

二、完善查询

1.保留输入框的内容v层修改

添加属性value="{:input('get.name')}" 外层的双引号,内层的单引号不要忘记加

<input name="name" type="text" class="form-control" placeholder="姓名..." value="{:input('get.name')}">

即给value一个值,这个值是获取的GET信息。

input和url一样,同为助手函数。input('get.name')作用同Request::instance()->get('name'),适用于在V层调用。

效果:查询时输入框会保留输入的内容

在这里插入图片描述

2.点查询出结果后,再点第二页查询结果就没了


原
变:
变成
但是我们发现,当我们点击第二页时,这个关键字就消失了。

通过生成的URL,我们的方法,它除了把url中page信息生成了以外,并没有生成我们的name信息。
http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2

正确的URL应该是这样:
http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2&name=王

http://127.0.0.1/thinkphp5/public/index/teacher/index/name/王.html?page=2

但是吧,显然thinkphp5并没有考虑用户直接用 ? 的形式来传值的感受,也就是说,它不会生成这样的链接:http://127.0.0.1/thinkphp5/public/index/teacher/index.html?page=2&name=王

ThinkPHP提前想到了这个需求,在调用paginate时,接收3个参数。我们来看一下源码的注释:

namespace think\db;
class Query
...
/**
     * 分页查询
     * @param int|null $listRows 每页数量
     * @param int|bool $simple   简洁模式或者总记录数
     * @param array    $config   配置参数
     *                           page:当前页,
     *                           path:url路径,
     *                           query:url额外参数,
     *                           fragment:url锚点,
     *                           var_page:分页变量,
     *                           list_rows:每页数量
     *                           type:分页类名
     * @return \think\paginator\Collection
     * @throws DbException
     */
    public function paginate($listRows = null, $simple = false, $config = [])
    {

其中第三个参数接收一个数组,这个数组接收一个键的名称为:query,指额外参数。query:url额外参数

/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
class TeacherController extends Controller
{
    public function index()
    {
    ...
	$teachers=$Teacher->paginate($page_size,false,[
                'query'=>[
                'name'=>$name
                ],
            ]); //
            //进行分页,每页展示page_size条,代替获取所有条数

再查询点下一页就能保持查询效果了页数不变了

附完整代码

1.c层

application\index\controller\TeacherController.php

<?php
namespace app\index\controller;     // 该文件的位于application\index\controller文件夹
use think\Controller;               // 用于与V层进行数据传递
use think\Request;                  // 引用Request
use app\common\model\Teacher;       // 教师模型

/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
class TeacherController extends Controller
{
    public function index()
    {
        try {
            $page_size=5; //0设置每页条数

            // 【1】获取查询名
            $name=Request::instance()->get('name');
            echo $name;

            $Teacher = new Teacher; 
            // $teachers = $Teacher->select(); //获取所有条数
            
            // 【2】查询数据库
            if(!empty($name)){
                $Teacher->where('name','like','%'.$name.'%');
            }
            
            $teachers=$Teacher->paginate($page_size,false,[
                'query'=>[
                'name'=>$name
                ],
            ]); //进行分页,每页展示page_size条,代替获取所有条数

            // 向V层传数据 3传入数据到v
            $this->assign('teachers', $teachers);

            // 取回打包后的数据
            $htmls = $this->fetch();

            // 将数据返回给用户
            return $htmls;
        } catch(\think\HttpResponseException\Exception $e){
            throw $e;
            
        }
         catch (\Exception $e) {
            // 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下代码的注释去掉。
            // throw $e;
            return '系统错误' . $e->getMessage();
        }
    }

    /**
     * 插入新数据
     * @return   html                   
     * @author pasa
     * @DateTime 2020-8-07T12:31:24+0800
     */
    public function insert()
    {
        $message='';
        try{
            // 接收传入数据
            $postData = Request::instance()->post();    

            // 实例化Teacher空对象
            $Teacher = new Teacher();

            // 为对象赋值
            $Teacher->name = $postData['name'];
            $Teacher->username = $postData['username'];
            $Teacher->sex = $postData['sex'];
            $Teacher->email = $postData['email'];

            // 新增对象至数据表
            $result = $Teacher->validate(true)->save();

            // 反馈结果
            if (false === $result) {
                $message='新增失败:' . $Teacher->getError();
            } else {
                return  $this->success($Teacher->name.'用户新增成功!',url('index'));
            }   
        }catch(\think\Exception\HttpResponseException $e){
            throw $e;
        }
        catch(\Exception $e){
            var_dump($e);
            return $e->getMessage();
        }
        return $this->error($message);
    }

    /**
     * 新增数据交互
     * @author pasa
     * @DateTime 2020-8-07T12:41:23+0800
     */
    public function add()
    {
        $htmls = $this->fetch();
        return $htmls;
    }


    /**
     * 删除
     * @return   跳转                   
     * @author pasa
     * @DateTime 2020-8-07T13:52:07+0800
     */
    public function delete()
    {
        // 获取pathinfo传入的ID值.
        $id = Request::instance()->param('id/d'); // 获取从地址传过来的参数 id /d 表示将数值转化为 整形
        // $id=100; //用于测试

        //没获取到id则抛出异常
        if (0 === $id) {
            // return $this->error('未获取到ID信息');
            throw \Exception('没获取到ID信息',1);
        }

        // 获取要删除的对象
        $Teacher = Teacher::get($id);

        // 要删除的对象不存在
        if (is_null($Teacher)) {
            return $this->error('不存在id为' . $id . '的教师,删除失败');
        }

        // 删除对象
        if (!$Teacher->delete()) {
            return $this->error('删除失败:' . $Teacher->getError());
        }

        // 进行跳转
        return $this->success('删除成功', url('index'));
    }


    /**
     * 编辑
     * @return   html                   
     * @author pasa
     * @DateTime 2020-8-07T13:52:29+0800
     */
    public function edit()
    {
        // 获取传入ID
        $id = Request::instance()->param('id/d');

        // 在Teacher表模型中获取当前记录
        if (is_null($Teacher = Teacher::get($id))) {
            return '系统未找到ID为' . $id . '的记录';
        } 
        
        // 将数据传给V层
        $this->assign('Teacher', $Teacher);

        // 获取封装好的V层内容
        $htmls = $this->fetch();

        // 将封装好的V层内容返回给用户
        return $htmls;
    }

    /**
     * 更新
     * @return                      
     * @author pasa
     * @DateTime 2020-8-07T14:03:41+0800
     */
    public function update()
    {
        try {
            // 接收数据,取要更新的关键字信息
            $id = Request::instance()->post('id/d');
            $message = '';

            // 获取当前对象
            $teacher = Teacher::get($id);

            if (!is_null($teacher)) {
                // 写入要更新的数据
                $teacher->name = Request::instance()->post('name');
                $teacher->username = Request::instance()->post('username');
                $teacher->sex = Request::instance()->post('sex/d');
                $teacher->email = Request::instance()->post('email');

                // 更新
                if (false === $teacher->validate(true)->save())
                {
                    $message =  '更新失败' . $teacher->getError();
                }
            } else {
                throw new \Exception("所更新的记录不存在", 1);   // 调用PHP内置类时,需要在前面加上 \ 
            }
        } catch (\Exception $e) {
            // 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下的代码的注释去掉
            // throw $e;
            $message = $e->getMessage();
        }
       
        return $message;
    }
}


2.v层

application\index\view\Teacher\index.html

<!DOCTYPE html>
<html lang="zh-hans">
<head>
    <meta charset="UTF-8">
    <title>教师管理</title>
    <!-- <link rel="stylesheet" type="text/css" href="/tp5/public/static/bootstrap-3.3.5-dist/css/bootstrap.min.css"> -->
     <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>

<body class="container">
    <div class="row">
        <div class="col-md-12">
            
            <hr />    
            <div class="row">

                <!-- 【1】查询 -->
                <div class="col-md-8">
                    <form class="form-inline">
                        <div class="form-group">
                            <label class="sr-only" for="name">姓名</label>
                            <input name="name" type="text" class="form-control" placeholder="姓名..." value="{:input('get.name')}">
                        </div>
                        <button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i>&nbsp;查询</button>
                    </form>
                </div>
                
                <!-- 【2】添加 -->
                <div class="col-md-4 text-right">
                    <a href="{:url('add')}" class="btn btn-primary"><i class="glyphicon glyphicon-plus"></i>&nbsp;添加</a>
                </div>

            </div>
            <hr />

            <table class="table table-hover table-bordered">
                <tr class="info">
                    <th>序号</th>
                    <th>姓名</th>
                    <th>性别</th>
                    <th>邮箱</th>
                    <th>用户名</th>
                    <th>操作</th>
                </tr>
                {volist name="teachers" id="teacher" key="key"}
                <tr>
                    <td>{$key}</td>
                    <td>{$teacher->getData('name')}</td>
                    <td>{eq name='teacher->getData("sex")' value='0'}男{else /}女{/eq}</td>
                    <td>{$teacher->getData('email')}</td>
                    <td>{$teacher->getData('username')}</td>
                    <td>
                        <a href="{:url('edit?id=' . $teacher->getData('id'))}">编辑</a>
                        &nbsp;&nbsp;
                        <a href="{:url('delete?id=' . $teacher->getData('id'))}">删除</a>
                    </td>
                </tr>
                {/volist}
            </table>
            <!-- 【1】展示分页 -->
            {$teachers->render()}
        </div>
    </div>
</body>
</html>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值