关于ThinkPHP5.0*的软删除delete_time的引用和部分时间函数where(),whereTime()连贯操作的问题
2018-01-20 22:02
756 查看
关于ThinkPHP5.0*的软删除和部分时间函数连贯操作的问题
1、使用软删除,可实现逻辑删除,有利于保护数据
使用软删除: 需要在model文件中 引入 use trait\SoftDelete; 代码如下: <?php namespace app\member\model; use think\Model; use traits\model\SoftDelete; //使用模拟多继承,此类在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 app\member\controller; use app\member\model\User 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 app\member\controller; use think\Controller; 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 app\common\model; use think\Model; use traits\model\SoftDelete; //引入软删除 //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表是否存在当前数据库中
以上纯属个人理解,如有异议欢迎交流指出!!!
相关文章推荐
- 1.利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果
- 关于ThinkPHP5.0.*的delete软删除的BUG问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 关于ThinkPHP3.2中连贯操作where的说明
- mysql数据库 thinkphp连贯操作where条件的判断不正确的问题
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 关于如何避免操作(update、delete)mysql数据库时忘记添加where而导致全表修改或删除情况
- PHP中关于在函数内引用全局变量的问题
- java中关于时间日期操作的常用函数(转摘)
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- 关于oracle数据库中的时间函数问题
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- java中关于时间日期操作的常用函数
- 收藏:java中关于时间日期操作的常用函数