关于ThinkPHP5.0*的软删除delete_time的引用和部分时间函数where(),whereTime()连贯操作的问题
关于ThinkPHP5.0*的软删除和部分时间函数连贯操作的问题
1、使用软删除,可实现逻辑删除,有利于保护数据
使用软删除:
需要在model文件中
引入 use traitSoftDelete;
代码如下:
<?php
namespace appmembermodel;
use thinkModel;
use traitsmodelSoftDelete; //使用模拟多继承,此类在thinkphp框架源码中,有兴趣可以自己查看
class User extends Model
{
use SoftDelete;
//注意: 5.0.2 版本之前 deleteTime 属性必须使用 static 定义
protected $deleteTime = "delete_time";
}
修改数据配置文件application/database.php中的
// 自动写入时间戳字段
"auto_timestamp" => false, //修改前
"auto_timestamp" => "datetime", //修改后,可以修改为datetime,timestamp,int
// 时间字段取出后的默认时间格式
"datetime_format" => false, //修改前
"datetime_format" => "Y-m-d H:i:s", //修改后
在控制器文件中引用如下代码:
<?php
namespace appmembercontroller;
use appmembermodelUser as UserModel; //防止控制器和model同名
class user extends Controller
{
# 静态方法操作
// 软删除
User::destroy(1); //注意: 执行本行操作之前,model类中必须先使用了软删除类SoftDelete,才能实现软删除,否则会将数据进行物理删除,即真实删除
// 真实删除
User::destroy(1,true);
# model对象操作
$user = new User();
//软删除
$user->destroy(1);
//真实删除
$user->destroy(1,true);
}
2、关于在ThinkPHP5.0.*中使用时间相关的函数
如:在一张数据表中既使用了软删除字段, 现在需要查询出2015-1-1到2016-1-1时间段之间的数据,
<?php
namespace appmembercontroller;
use thinkController;
class User extends Controller
{
/**
* 查询不含软删除的字段
*/
public function selSoftDel()
{
$time = strtotime(date("Y-m-d"));
// $time = date("Y-m-d H:i:s",strtotime(date("Y-m-d")));
var_dump($time);
$user = new UserModel();
//只查询软删除的字段
$softRes = $user->onlyTrashed()->select();
//注意: where()方法在使用软删除情况下,会出现异常,因为使用软删除时,默认是在sql语句中拼接了 "and delete_time = null" 的条件查询,可以打印下面的$selectSql 看一下
//本句返回当前的sql语句,便于查看sql语句是否出错
$selectSql = $user->where("create_time","between time",["2017-1-20","2017-1-21"])->fetchSql()->select();
/*
输出:
"SELECT * FROM `test1` WHERE ( `create_time` BETWEEN "2018-01-20 00:00:00" AND "2018-01-21 00:00:00" ) AND `test1`.`delete_time` IS NULL"
*/
//使用软删除,同时有需要某个时间区间的数据时,可使用whereTime(),whereTime()和where()用法类似,可用于连贯操作,具体参数可见官方手册
$res = $user->whereTime("create_time","d")->select();
var_dump($res);
}
}
3、当存在分表情况时(分表规则: 一般使用唯一标识的id或者hash线性规则进行分表等等,具体规则是具体情况)
<?php
namespace appcommonmodel;
use thinkModel;
use traitsmodelSoftDelete; //引入软删除
//Base基类
class Base extends Model {
# 使用软删除
use SoftDelete;
protected $deleteTime = "delete_time";
/**
* 根据模板创建数据表
* @param $table string 数据表名
* @param $baseTable string 数据基表名
* @return type true
*/
protected function createTable($table,$baseTable) {
# 思路:判断表是否存在,若表不存在,则创建表,否则返回true退出,
try {
$this->checkTable($table);
} catch(Exception $e) {
if (!$tableExists) {
try {
$sql = "CREATE TABLE " . $table . " LIKE " . $baseTable;
$this->execute($sql);
} catch (Exception $e) {
return true; //表已经存在
}
}
}
}
/**
* 判断数据表是否存在
* @param type $table 数据表名
* @return type 执行结果
*/
protected function checkTable($table) {
$sql = "SHOW TABLES LIKE ". $table;
//$sql = "CREATE TABLE IF NOT EXISTS ". $table;
return $this->execute($sql);
}
4、**注意点**
1) Tp5中create_time, update_time , delete_time是系统字段,不得占用,否则会出现难以想象的后果,
2) 一旦将database.php的配置修改为 ("auto_timestamp" => "datetime","datetime_format" => "Y-m-d H:i:s",), 则同一数据库下所有的数据表都必须设有create_time,update_time,delete_time这三个字段,否则报错,
3) 一旦database.php的字段类型配置好后,数据库对字段类型更改将失效, 例如: "auto_timestamp" => "datetime", 数据库create_time,update_time,delete_time字段类型都只能是datetime,无法改为其他字段类型
4) 连贯操作中,每个方法都会返回当前对象(即return $this),所以对象$user在首位,select()在尾部,中间的方法位置没有严格限制,如:
$user->where("create_time","between time",["2017-1-20","2017-1-21"])->fetchSql()->select();
$user->fetchSql()->where("create_time","between time",["2017-1-20","2017-1-21"])->select();
//上述两个例句效果相同
5) CREATE TABLE IF NOT EXISTS "user1" LIKE "during.user"; //当user1存在时,以during数据库中的user表为模板创建user1
6) SHOW TABLES LIKE "user"; //判断user表是否存在当前数据库中
以上纯属个人理解,如有异议欢迎交流指出!!!
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 软删除与唯一索引冲突的解决方案
- 下一篇: Linux环境下Mysql++安装及操作深入详解