1. 程式人生 > >關於ThinkPHP5.0*的軟刪除delete_time的引用和部分時間函式where(),whereTime()連貫操作的問題

關於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表是否存在當前資料庫中 
以上純屬個人理解,如有異議歡迎交流指出!!!