ThinkPHP5模型实例详解
/ delete实例删除
delete实例删除
模型实例删除:delete( )
1. 功能:将当前数据对象软删除;
该方法属于SoftDelete类,并不是Model类中的,因为这个类优先级高于Model类,所以当前模型调用delete方法时,实际上是被SoftDelete类的delete方法拦截,真正执行的是SoftDelete类中的delete方法,而并不是我们熟悉的Model类的delete方法,一定要注意!
- 如果不太理解,请回看本章第一课的内容:Traits类的用法详解
2. 步骤:
- 获取模型实例:数据对象;
- 删除该对象,即模型实例。
3. 实例演示
一、准备工作
- 给当前表添加delete_time字段
默认值为NULL,不设置也会自动为NULL,字段类型不可以是TIMESTAMP,因为这个类型的默认值由系统设置,适合于更新字段时间字段。
- 添加字段SQL语句如下:
ALTER TABLE tp5_staff ADD delete_time DATETIME DEFAULT NULL;
- 现在表中情况:
提示:如果某记录被软删除,则delete_time字段就会有值:'删除时间';
- 修改模型文件 :Staff.php
<?php
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete; //导入SoftDelete构件类
class Staff extends Model
{
//引入SoftDelete类
use SoftDelete;
//设置自定义删除时间字段名称
protected $deleteTime = 'delete_time';
}
模型代码分析:
protected $deleteTime = 'delete_time';
: 该语句设置删除时间字段名称,如果是'delete_time',可以不设置。- 软删除字段名默认是:delete_time,如果你的是del_time,必须要加上:
protected $deleteTime = 'del_time';
,不可省略。
准备工作结束,下面开始进入实例~~
二、实例演示:
- 控制器:Index.php
<?php
namespace app\index\controller;
use app\index\model\Staff;
class Index
{
public function index()
{
///获取id=1002的模型实例,创建数据对象$data
$data = Staff::get(1002);
//删除当前数据对象
$affected = $data->delete();
//反馈执行结果
echo $affected ? '成功的软删除了'.$affected.'条记录!' : '软删除失败~~';
}
}
- 运行结果:
成功的软删除了1条记录!
- 我们更次查看一下数据表:
软删除记录的标志就是:delete_time字段不为NULL,而是删除时间。
下面再演示一下如何查看
- 正常查询:不显示已软删除的记录
- 控制器代码:
<?php
namespace app\index\controller;
use app\index\model\Staff;
class Index
{
public function index()
{
//创建查询闭包函数
$closure = function ($query){
$query -> field('id,name,delete_time');
};
//执行查询
$result = Staff::all($closure);
foreach ($result as $data){
dump($data->getData());
}
}
}
- 查询结果如下:
不包括被软删除的数据
array(3) {
["id"] => int(1001)
["name"] => string(6) "郭靖"
["delete_time"] => NULL
}
array(3) {
["id"] => int(1005)
["name"] => string(9) "欧阳锋"
["delete_time"] => NULL
}
array(3) {
["id"] => int(1006)
["name"] => string(6) "杨康"
["delete_time"] => NULL
}
- 特殊查询:可以查看已被软删除掉的数据
- 控制器代码:
<?php
namespace app\index\controller;
use app\index\model\Staff;
class Index
{
public function index()
{
//用SoftDelete类的withTrashed() 方法实现
$result = Staff::withTrashed()
->field('id,name,delete_time') //设置查询条件
-> select(); //输出结果集:对象数组
//遍历对象数组
foreach ($result as $data){
//输出原始数据
dump($data->getData());
}
}
}
这里为什么要用select方法而不是all方法,因为withTrashed() 返回的是数据库查询Query对象,这一点格外注意。当然,最后返回的仍然是对象数组,而不是二维数组,因为这里毕竟是模型Staff调用,而不是Db调用。
- 查看结果:
包括已被软删除的数据
array(3) {
["id"] => int(1001)
["name"] => string(6) "郭靖"
["delete_time"] => NULL
}
array(3) {
["id"] => int(1002)
["name"] => string(6) "黄蓉"
["delete_time"] => string(19) "0000-00-00 00:00:00"
}
array(3) {
["id"] => int(1005)
["name"] => string(9) "欧阳锋"
["delete_time"] => NULL
}
array(3) {
["id"] => int(1006)
["name"] => string(6) "杨康"
["delete_time"] => NULL
}
4. 总结
这里的delete方法与Model类中的delete方法完全不同,一定要注意。这也是trait类实现PHP多继承的典型应用,课后,请将该实例上机做一遍。