MVC
M: model (模型) 就是数据库操作类(通过数据库操作类去操作各个表),必须要实例化一个数据库操作类
V: view (模版/视图) 第一个视图指mysql里的视图(没有),第二个视图是指模板
C; control (模块/控制器 )通过控制器来实现模板,模型之间的控制关系
url地址f访问时写的是模块/控制器/方法
index/index/version 查看tp5版本,就是利用了模板里的{$Think.version}
显示主页:
控制类(index/controller/Teachers.php)
use app\common\model\Teacher;//引入
use think\Controller;
public function index() {
//实例化模型类:new 类名 $Teacher = new Teacher; $teachers = $Teacher->select(); // 向V层传数据 $this->assign('teachers', $teachers); // 取回打包后的数据
//使用fetch方法要引入:use think\Controller;并让teacher类继承Controller类
$htmls = $this->fetch();
// 将数据返回给用户 return $htmls; }
模型类(app/common/Teacher.php)
namespace app\common\model; use think\Model; class Teacher extends Model { }
其中不需要写什么,继承基础类model类就可以,基本方法在model里
模板类(index/view/teachers/index.php)
教师管理 class="container">class="row">class="col-md-12">class="table table-hover table-bordered">
class="info"> {volist name="teachers" id="teacher" key="key"}序号 姓名 性别 邮箱 用户名 操作 {/volist} {$key} {$teacher->getData('name')} {eq name='teacher->getData("sex")' value='0'}男{else /}女{/eq} {$teacher->getData('email')} {$teacher->getData('username')} $teacher->getData('id'))}">编辑 $teacher->getData('id'))}">删除
实现效果
增:
在控制器类里需要些两个方法,一个是add()方法用来显示增添人员的页面,一个是insert()方法用来把数据插入数据库,调用的是模型中的save()方法
use think\Request;
//引入这个类获取表单请求的值
public function add() { $htmls = $this->fetch(); return $htmls; } public function insert() { // 接收传入数据 $postData = Request::instance()->post(); // 实例化Teacher空对象 $Teacher = new Teacher(); // 为对象赋值 $Teacher->name = $postData['name']; $Teacher->username = $postData['username']; $Teacher->sex = $postData['sex']; $Teacher->email = $postData['email']; // $Teacher->create_time =time();//因为在database.php中加入了'auto_timestamp' => true,使用自动加入时间戳,所以这里不需要再加
// 新增对象至数据表
$result=$Teacher->validate(true)->save($Teacher->getData()); // 反馈结果 if (false === $result) { return $this->error('新增失败:' . $Teacher->getError(),'Teachers/add'); } else { return $this->success('新增成功。新增ID为:' . $Teacher->id,'Teachers/index'); } }
在模板index.php中增加一个链接,当点击增加链接时跳转到teachers控制器下的add方法
<a href="{:url('Teachers/add')}">增加a>
效果图:
删
获取删除对象的id,然后调用的是模型中的delete()方法
public function delete() { // 获取pathinfo传入的ID值. $id = Request::instance()->param('id/d'); // “/d”表示将数值转化为“整形” if (is_null($id) || 0 === $id) { return $this->error('未获取到ID信息'); } // 获取要删除的对象 $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')); }
效果图:
当删除不存在的id时(页面显示的id与数据库数据的id不一样,在index.html中用的是{$key}的值):
查
控制器里原来的index()方法:要重新改写:
public function index() { $name=Request::instance()->get('name'); echo $name; $Teacher = new Teacher; if(!empty($name)){ $teachers=$Teacher->where('name','like','%'.$name.'%')->select(); }else{ $teachers = $Teacher->select(); } // 向V层传数据 $this->assign('teachers', $teachers); // 取回打包后的数据 $htmls = $this->fetch(); // 将数据返回给用户 return $htmls; }
在主页面显示index.html中增加查询框:
如果我们只想跳回到当前页,那么在url()函数中,是不需要有任何参数的。url()表示生成 当前模块当前控制器当前触发器 的链接
<hr /> <div class="row"> <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> 查询button> form> div> div> <hr />
效果图:
现在发现一个问题,当我们输入关键字点击查询后,原来查询框了关键字消失了
在模板index.html里的查询框里给一个value值,可解决
<input name="name" type="text" class="form-control" placeholder="姓名..." value="{:input('get.name')}">
input
和url
一样,同为助手函数。input('get.name')
作用同Request::instance()->get('name')
,适用于在V层调用。
改
在控制器类里需要些两个方法,一个是edit()方法通过传id用来显示修改人员的页面,一个是update()方法用来更新数据库,调用的是也是模型中的save()方法
public function edit() { // 获取传入ID $id = Request::instance()->param('id/d'); // 在Teacher表模型中获取当前记录 $Teacher = Teacher::get($id); // 将数据传给V层 $this->assign('Teacher', $Teacher); // 获取封装好的V层内容 $htmls = $this->fetch(); // 将封装好的V层内容返回给用户 return $htmls; }
更新数据库第一种方法
直接接收数据
public function update() { try { $t1=Request::instance()->post(); // 获取当前对象 $teacher=new Teacher(); if (!is_null($t1)) { if (false === $teacher->validate(true)->isUpdate()->save($t1)) { return $this->error('更新失败' . $teacher->getError()); } } else { throw new \Exception("所更新的记录不存在", 1); // 调用PHP内置类时,需要在前面加上 \ } // 获取到ThinkPHP的内置异常时,直接向上抛出,交给ThinkPHP处理 } catch (\think\Exception\HttpResponseException $e) { throw $e; // 获取到正常的异常时,输出异常 } catch (\Exception $e) { return $e->getMessage(); } // 成功跳转至index触发器 return $this->success('操作成功', url('index')); }
第二种办法
通过获取接收id,通过id操作数据库
public function update2() { // 接收数据,获取要更新的关键字信息 $id = Request::instance()->post('id/d'); // 获取当前对象 $Teacher = Teacher::get($id); // 写入要更新的数据 $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'); // 更新 $flag=$Teacher->validate(true)->save(); if($flag){ return $this->success('更新成功', url('index')); }else{ return $this->error('更新失败', url('edit')); } }
效果: