关于ThinkPHP5.0*的软删除delete_time的引用和部分时间函数where(),whereTime()连贯操作的问题

关于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表是否存在当前数据库中 
以上纯属个人理解,如有异议欢迎交流指出!!! 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值