Thinkphp5.0 的使用模型Model的獲取器與修改器


Thinkphp5.0 的使用模型Model的獲取器、修改器、軟刪除


 一、獲取器

在model中使用 get+字段名+Attr,可以修改字段的返回值。

數據庫中性別保存為,0未知、1男、2女,查詢時返回漢字:

model:

    //將性別的012修改為未知、男。女返回
    public function getSexAttr($val){
        switch($val){
            case '1' :
                return '男';
            case '2':
                return '女';
            default:
                return '未知';
        }
    }

    //格式化時間戳后返回
    public function getAddtimeAttr($val){
        if($val){
            return date('Y-m-d H:i:s',$val);
        }else{
            return $val;
        }
    }

 

controller:

        $res = TestUser::get(2);
        dump($res->toArray());//性別會被model轉化
        dump($res->getData());//返回原始數據

 二、模型修改器:

在model中使用 set+字段名+Attr,可以修改字段值,方便添加數據時使用。

示例,比如密碼需要MD5加密:

model:

    //對密碼字段加密之后存儲
    //第一個參數是密碼
    //第二個參數是添加的數據,可選
    public function setPasswordAttr($val,$data){
        if($val === '') {
            return $val;
        }else{
            return md5($val.$data['email']);
        }
    }

 三、自動完成:

model:

    //添加和修改時,都會自動完成的字段
    protected $auto = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }

 三、添加數據時,自動完成:

model:

    protected $insert = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }

 四、修改數據時,自動完成:

model:

    protected $update = ['addtime'];

    public function setAddtimeAttr(){
        return time();
    }

五、自動完成時間戳

在數據庫配置文件database.php中,有一項:

// 自動寫入時間戳字段

'auto_timestamp'  => false,
如果開啟,則會自動完成所有表的時間戳,但是不建議這樣,只在需要的地方設置更安全。
例如對用戶表的時間戳自動完成,就在User的model中設置:
<?php
namespace app\index\model;
use think\Model;

class User extends Model{

    //開啟自動完成時間戳功能
    protected $autoWriteTimestamp = true;
    //開啟后,
    //添加數據時,默認自動完成的字段是:create_time和update_time。
    //修改數據時,默認自動完成的字段是:update_time。
    //如果數據庫不是這兩個字段,則會報錯
    //如果不想用這兩個字段,可以進行如下修改
    protected $createTime = 'addtime';//修改默認的添加時間字段
    protected $updateTime = 'updtime';//修改默認的修改時間字段

   protected $updateTime = false;//當不需要這個字段時設置為false
}
 
        

六、軟刪除

軟刪除:當刪除條記錄時,有時我們需要假刪除,只通過修改某個字段狀態來標記記錄已刪除。

model:

<?php
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;//引入軟刪除的類

class User extends Model{

    //使用軟刪除
    //刪除時,默認更新的字段是delete_time
    use SoftDelete;
    //如果修改修改默認的字段名字
    protected $deleteTime = 'deltime';
}

控制器:

    $res = User::destroy(1);//軟刪除
    //返回影響的行數
    dump($res);

執行刪除后,就會更新delete_time字段,如果update_time字段也開啟了自動完成,也會更新update_time字段。

    //獲取所有數據,會過濾掉delete_time不為null的記錄(即軟刪除的記錄不會顯示)
    //注意,delete_time字段默認值要設置為null,不能設置為0,否則0頁會被視為軟刪除過的數據
    $res = $model->select();

    //如果需要獲取包含軟刪除的數據,使用withTrashed(true)。
    $res = User::withTrashed(true)->select();

    //如果需要獲取軟刪除過的數據
    $res = User::onlyTrashed()->select();

    //刪除id是15的記錄,如果開啟軟刪除,會進行假刪除
    $res = User::destroy(15);

    //如果開啟了軟刪除,需要真正地刪除數據,不做軟刪除
    //destory()第二個參數傳遞true
    $res = User::destroy(15,true);
    //delete()參數傳遞true
    $userData = User::get(15);
    $userData->delete(true);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM