一文詳解Thinkphp5中怎麼增刪改查資料庫

2022-02-10 19:00:44
Thinkphp5中怎麼運算元據庫,進行增刪改查?下面本篇文章就來帶大家詳細瞭解一下Thinkphp5中增刪改查資料庫的方法,希望對大家有所幫助!

thinkphp標準資料表設計:

建立時間欄位:create_time

更新時間欄位:update_time

刪除時間欄位:delete_time

型別選int,如下圖:

1.png

【相關教學推薦:】

一、建立model的資料夾

在application資料夾下的二級物件目錄中新建名為model的資料夾,該資料夾與對應的controller和view目錄同級,如下圖:

2.png

如果有多個模組(比如前臺index,後臺admin),操作的資料庫都差不多,那麼可以把model模型放到common公共模組裡,如下:

3.png

二、建立model模型類

1、在model目錄下建立model物件檔案,一般model的名字和表名是對應的,例如:

表名 pre_user       --------------->  模型名 User.php
表名 pre_user_info  --------------->  模型名 UserInfo.php

2、定義model模型

<?php
namespace app\index\model;
use think\Model;
use think\Db;

class User extends Model{
	/**
     * 定義變數
     * 1.變數名稱應與資料表中的欄位名相同
     * 2.此處可根據需求省略,因為如果沒有,thinkphp會自動在資料表中尋找的對應欄位名
     */
	public $username;
	public $password;
}
?>

3、如果資料模型定義名和表名不一致,那麼就需要額外定義和宣告,如下:

<?php
namespace app\index\model;
use think\Model;
use think\Db;

class User extends Model
{
	protected $table = "admin_user";//指定資料表名
    protected $pk = 'id';           //指定主鍵的欄位
}
?>

三、呼叫model模型的方法

//匯入定義的資料模型類
use \app\index\model\User;

//方法一:
$res = User::get(1);

//方法二:
$user = new User;
$res = $user::get(1);	

//方法三:
use think\Loader;
$user = Loader::model("User");
$res = $user::get(1);

//方法四:
$user = model("User");       
$res = $user::get(1);

四、查詢操作

get 獲取一條記錄

$res = User::get(1);

all 獲取多條記錄

1、不傳參

$result = User::all(); //查詢出所有記錄

2、引數為n,n為正整數

$result = User::all(1); //查詢出id為1的記錄

3、引數為'n1, n2, n3...'

$result = User::all('7, 8, 9, 10'); //查詢出id為7、8、9、10的4條記錄

4、引數為[n1, n2, n3...]

$result = User::all([7, 8, 9, 10]); //查詢出id為7、8、9、10的4條記錄

find 查詢某一條

 $res = User::where('id','1')->field('name')->find();

不等於

->where('id','neq',1)

select 多條查詢

$res = User::where('id','1')->field('name')->limit(2)->order('id DESC')->select();

value 按欄位查詢一條

$res = User::where('id','1')->value('name');

將結果轉換成陣列

$res = $res->toArray();

查詢數目

//查詢總條數
$res = User::count();
//按條件統計條數
$res = User::where('id','>',3)->count();

whereTime() 時間條件查詢

1、獲取今天的資訊

db('table')->whereTime('c_time', 'today')->select();
//也可以簡化為下面方式
db('table')->whereTime('c_time', 'd')->select();

2、獲取昨天的資訊

db('table')->whereTime('c_time', 'yesterday')->select();

3、獲取本週的資訊

db('table')->whereTime('c_time', 'week')->select();   
//也可以簡化為下面方式
db('table')->whereTime('c_time', 'w')->select();

4、獲取本月的資訊

db('table')->whereTime('c_time', 'month')->select();   
//也可以簡化為下面方式
db('table')->whereTime('c_time', 'm')->select();

5、獲取上月的資訊

db('table')->whereTime('c_time','last month')->select();

6、獲取今年的資訊

db('table')->whereTime('c_time', 'year')->select();    
//也可以簡化為下面方式
db('table')->whereTime('c_time', 'y')->select();

7、獲取去年的資訊

db('table')->whereTime('c_time','last year')->select();

8、日期區間查詢

//根據時間戳查詢今天到後天
db('table')->whereTime('time', 'between', [strtotime(date('Y-m-d')), strtotime(date('Y-m-d', strtotime('+2 day')))])->select();
根據日期查詢今天到後天
db('table')->whereTime('time', 'between', ['2020-3-28', '2020-3-30'])->select();

五、新增操作

1、使用create()方法新增

$res = User::create([
     'name'      => '安陽',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

2、新增資料,並返回新增的主鍵

$uid=UserModel::create([
     'name'      => '安陽',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ])->id;

也可以使用DB類的insertGetId方法,如下:

$uid = User::insertGetId([
     'name'      => '安陽',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

3、範例化方式新增

 $user = new User;
 $user->name =  '安陽';
 $user->age =  23;
 $user->save();

4、範例化方式過濾插入欄位,返回插入行數

 $user = new User;
 $data = [
     'name' => '安陽',
     'age' => 23,
     'email' => '[email protected]'
 ];
 //只有name和age欄位會寫入
 $res = $user->allowField(['name', 'age'])->save($data);

5、模型使用allowField()過濾非資料表欄位的資料

//定義模型物件,並傳入post資料
$user = new User($_POST);
//過濾post陣列中的非資料表欄位資料
$user->allowField(true)->save();

6、模型使用allowField()指定某些欄位寫入

$user = new User;
// post陣列中只有name和email欄位會寫入
$user->allowField(['name','email'])->save($_POST, ['id' => 1]);

7、批次新增使用saveAll()

user = new User;
$list = [
    ['name'=>'安陽','email'=>'[email protected]'],
    ['name'=>'小柒','email'=>'[email protected]']
 ];
$user->saveAll($list);

也可以使用DB類的insertAll()方法,返回新增成功的條數

$res = User::insertAll([
     'name'      => '安陽',
     'age'       => 23,
     'sex'       => 1,
     'password'  => '123456'
 ]);

補充,過濾欄位的其他方法:

1、在DB操作中,可以使用 strict 關閉欄位嚴格檢查

Db::name(‘user’)->strict(false)->insert($data);

2、使用php的 unset() 方法銷燬變數

unset($data[‘file’]);

6、saveAll新增多條資料,返回物件列表

 $user = new User;
 $data = [
     [
         'name' => '安陽',
         'age' => 20,
         'email' => '[email protected]'
     ],
     [
         'name' => '小柒',
         'age' => 25,
         'email' => '[email protected]'
     ]
 ];
 $res = $user->allowField(['name', 'age'])->saveAll($data);

六、更新操作

1、update 返回影響行數

 $res = User::where(['id'=>1])->update(['name'=>'安陽']);

2、setField 單獨更新某個欄位

User::where('id',1)->setField('name','安陽');

3、setInc

//setInc('money',10)表示將money欄位加上10
User::where(['id'=>1])->setInc('money', 10);

4、setDec

//setDec('money',10)表示將money欄位減去10
User::where(['id'=>1])->setDec('money', 10);

5、批次更新,要求資料中含有主鍵,返回更新物件列表

$user = new User;
$res = $user->saveAll([
     ['id'=>1, 'name' => '安陽'],
     ['id'=>2, 'name' => '小柒']
 ]);

七、刪除操作

1、傳入主鍵,返回影響行數

$res = User::destroy(1);

2、傳入條件,返回影響行數

 $res = User::destroy(['name'=>'安陽']);

3、條件刪除 返回影響行數

 $res = User::where(['id'=>1])->delete();

八、事務

1、自動控制事務處理

Db::transaction(function(){ 
    Db::table('order')->where(['id'=>1])->delete(); 
	Db::table('user')->where('id'=>1)->setInc('money',10);	
});

2、手動控制事務

Db::startTrans();//啟動事務
try {
    Order::where(['id'=>1])->delete();
	User::where('id'=>1)->setInc('money',10);
	Db::commit();//提交事務
} catch (Exception $e) {
	Db::rollback();	//回滾
}

九、model模型的獲取器

讀取器的命名規範是:->get + 屬性名的駝峰命名 + Attr

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{		    
    //獲取器:將性別的012修改為男、女、未知 返回
	public function getSexAttr($val)
	{
		switch ($val) {
            case 1:
                return '男';
            case 2:
                return '女';
            default:
            return '未知';
		}
	}
   //獲取器:格式化時間戳後返回
    public function getUpdateTimeAttr($val){
        if(!empty($val)){
			//如果是時間戳,就格式化
			if(!strtotime($val)) {
				return date('Y-m-d H:i:s',$val);
			}else{
				return $val;
			}
        }else{
			return '';
		}
    }
}

補充說明:strtotime()將任何英文文字的日期時間描述解析為Unix 時間戳,成功則返回時間戳,否則返回 FALSE(在 PHP 5.1.0之前本函數在失敗時返回 -1)

十、model模型的修改器

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	//修改器
	public function setTimeAttr()
	{
        return time();
	}
    /** 修改器:對密碼欄位加密之後儲存
     * $val  第一個引數是密碼
     * $data 第二個引數是新增的資料(可選)
     */
    public function setPasswordAttr($val,$data){
        if($val === '') {
            return $val;
        }else{
            return md5($val.$data['email']);
        }
    }
}

十一、model模型的自動完成

auto 新增及更新的時候,自動完成的屬性陣列
insert 僅新增的時候,自動完成的屬性陣列
update 僅更新的時候,自動完成的屬性陣列

1、自動完成

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	//新增和修改時,都會自動完成的欄位
    protected $auto = ['addtime'];

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

2、新增資料時,自動完成

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	// 新增 自動完成
    protected $insert = ['addtime'];

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

3、更新資料時,自動完成:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	// 更新 自動完成
    protected $update = ['addtime'];

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

十二、自動完成時間戳

在資料庫組態檔database.php中,有下列這項設定:

//自動寫入時間戳欄位
'auto_timestamp'  => false,
//如果開啟(設定為true),則會自動完成所有表的時間戳,但是不建議這樣,只在需要的地方設定更安全。

例如對使用者表的時間戳自動完成,就在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
}

Thinkphp更新時,自動更新update_time欄位時間戳的方法:

1、使用update

User::update(['name'=>'安陽'],['id'=>1]);

Thinkphp中update方法的原始碼如下:

/**
    * 更新資料
    * @access public
    * @param array      $data  資料陣列
    * @param array      $where 更新條件
    * @param array|true $field 允許欄位
    * @return $this
    */
   public static function update($data = [], $where = [], $field = null)
   {
       $model = new static();
       if (!empty($field)) {
           $model->allowField($field);
       }
       $result = $model->isUpdate(true)->save($data, $where);
       return $model;
   }

2、使用save

$user=new User;
$user->isUpdate(true)->save(['name'=>'安陽'],['id'=>1]);

十三、軟刪除

什麼是軟刪除?

當刪除某些記錄時,有時我們需要假刪除,只通過修改某個欄位狀態來標記該記錄已刪除,但實際上,資料庫中還是存在這些記錄的。假刪除的應用場景還是比較多的,例如支付寶的收款記錄,我們在APP上刪除後,就不會再顯示出來,你是不是以為真的刪掉了,不會再留下任何痕跡?非也,非也,刪除支付寶收款記錄只是軟刪除,在支付寶的資料庫中,實際上還保留有這些收款記錄,如果你的收款涉嫌違規或者觸犯法律,警方還是能通過支付寶的網警後臺檢視到的。

1、開啟軟刪除

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

class Order extends Model{
    //使用軟刪除
    //刪除時,預設更新的欄位是delete_time
    use SoftDelete;
    //如果資料表裡不是delete_time這個欄位,則會報錯。需要進行如下修改:
    protected $deleteTime = 'deltime';
}

2、 控制器裡軟刪除,返回影響的行數

 $res = Order::destroy(1);

執行刪除後,就會更新delete_time欄位,如果update_time欄位也開啟了自動完成,也會更新update_time欄位。

3、如果開啟了軟刪除,需要真正地刪除資料,而不做軟刪除,用下面的方法

//destory()第二個引數傳遞true
$res = Order::destroy(1,true);

//delete()引數傳遞true
$orderData = Order::get(1);
$orderData ->delete(true);

4、查詢已軟刪除的資料

$res = Order::withTrashed(true)->find(1);

5、查詢僅包含已軟刪除的資料

$res = Order::onlyTrashed()->select();

推薦學習:《》

以上就是一文詳解Thinkphp5中怎麼增刪改查資料庫的詳細內容,更多請關注TW511.COM其它相關文章!