目錄
thinkphp標準資料表設計:
 $res = User::where(['id'=>1])->update(['name'=>'安阳']);
登入後複製
" >
 $res = User::where(['id'=>1])->update(['name'=>'安阳']);
登入後複製
$res = User::destroy(1);
登入後複製
" >
$res = User::destroy(1);
登入後複製
讀取器的命名規格是:
十、model模型的修改器
十一、model模型的自动完成
十二、自动完成时间戳
Thinkphp更新时,自动更新update_time字段时间戳的方法:
十三、软删除
首頁 php框架 ThinkPHP 一文詳解Thinkphp5中怎麼增刪改查資料庫

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

Feb 10, 2022 pm 06:22 PM
資料庫操作

Thinkphp5中怎麼操作資料庫,進行增刪改查?以下這篇文章就來帶大家詳細了解Thinkphp5中增刪改查資料庫的方法,希望對大家有幫助!

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

thinkphp標準資料表設計:

建立時間字段:create_time

更新時間字段:update_time

刪除時間欄位:delete_time 

類型選int,如下圖:

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

##【相關教學建議:

thinkphp框架

一、建立model的資料夾

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

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

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

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

二、建立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 = &#39;id&#39;;           //指定主键的字段
}
?>
登入後複製

三、呼叫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(&#39;7, 8, 9, 10&#39;); //查询出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(&#39;id&#39;,&#39;1&#39;)->field(&#39;name&#39;)->find();
登入後複製

 不等於
##->where('id','neq',1)

select 多條查詢

$res = User::where(&#39;id&#39;,&#39;1&#39;)->field(&#39;name&#39;)->limit(2)->order(&#39;id DESC&#39;)->select();
登入後複製
value 以欄位查詢一則

$res = User::where(&#39;id&#39;,&#39;1&#39;)->value(&#39;name&#39;);
登入後複製
#將結果轉換成陣列

$res = $res->toArray();
登入後複製
查詢數目

//查询总条数
$res = User::count();
//按条件统计条数
$res = User::where(&#39;id&#39;,&#39;>&#39;,3)->count();
登入後複製
whereTime() 時間條件查詢

1、取得今天的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;today&#39;)->select();
//也可以简化为下面方式
db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;d&#39;)->select();
登入後複製

2、取得昨天的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;yesterday&#39;)->select();
登入後複製

3、取得本週的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;week&#39;)->select();   
//也可以简化为下面方式
db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;w&#39;)->select();
登入後複製

4、取得本月的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;month&#39;)->select();   
//也可以简化为下面方式
db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;m&#39;)->select();
登入後複製

 5、取得上月的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;,&#39;last month&#39;)->select();
登入後複製

6、取得今年的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;year&#39;)->select();    
//也可以简化为下面方式
db(&#39;table&#39;)->whereTime(&#39;c_time&#39;, &#39;y&#39;)->select();
登入後複製

 7、取得去年的資訊

db(&#39;table&#39;)->whereTime(&#39;c_time&#39;,&#39;last year&#39;)->select();
登入後複製

8、日期區間查詢

//根据时间戳查询今天到后天
db(&#39;table&#39;)->whereTime(&#39;time&#39;, &#39;between&#39;, [strtotime(date(&#39;Y-m-d&#39;)), strtotime(date(&#39;Y-m-d&#39;, strtotime(&#39;+2 day&#39;)))])->select();
根据日期查询今天到后天
db(&#39;table&#39;)->whereTime(&#39;time&#39;, &#39;between&#39;, [&#39;2020-3-28&#39;, &#39;2020-3-30&#39;])->select();
登入後複製

五、新增操作

1、使用create()方法新增

$res = User::create([
     &#39;name&#39;      => &#39;安阳&#39;,
     &#39;age&#39;       => 23,
     &#39;sex&#39;       => 1,
     &#39;password&#39;  => &#39;123456&#39;
 ]);
登入後複製

2、新增數據,並傳回新增的主鍵

$uid=UserModel::create([
     &#39;name&#39;      => &#39;安阳&#39;,
     &#39;age&#39;       => 23,
     &#39;sex&#39;       => 1,
     &#39;password&#39;  => &#39;123456&#39;
 ])->id;
登入後複製

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

$uid = User::insertGetId([
     &#39;name&#39;      => &#39;安阳&#39;,
     &#39;age&#39;       => 23,
     &#39;sex&#39;       => 1,
     &#39;password&#39;  => &#39;123456&#39;
 ]);
登入後複製

3、實例化方式新增

 $user = new User;
 $user->name =  &#39;安阳&#39;;
 $user->age =  23;
 $user->save();
登入後複製

4 、實例化方式過濾插入字段,返回插入行數

 $user = new User;
 $data = [
     &#39;name&#39; => &#39;安阳&#39;,
     &#39;age&#39; => 23,
     &#39;email&#39; => &#39;123456@qq.com&#39;
 ];
 //只有name和age字段会写入
 $res = $user->allowField([&#39;name&#39;, &#39;age&#39;])->save($data);
登入後複製

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

//定义模型对象,并传入post数据
$user = new User($_POST);
//过滤post数组中的非数据表字段数据
$user->allowField(true)->save();
登入後複製

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

$user = new User;
// post数组中只有name和email字段会写入
$user->allowField([&#39;name&#39;,&#39;email&#39;])->save($_POST, [&#39;id&#39; => 1]);
登入後複製

7、批次新增使用saveAll()

user = new User;
$list = [
    [&#39;name&#39;=>&#39;安阳&#39;,&#39;email&#39;=>&#39;thinkphp@qq.com&#39;],
    [&#39;name&#39;=>&#39;小柒&#39;,&#39;email&#39;=>&#39;12345678@qq.com&#39;]
 ];
$user->saveAll($list);
登入後複製

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

$res = User::insertAll([
     &#39;name&#39;      => &#39;安阳&#39;,
     &#39;age&#39;       => 23,
     &#39;sex&#39;       => 1,
     &#39;password&#39;  => &#39;123456&#39;
 ]);
登入後複製

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

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

Db::name(‘user’)->strict(false)->insert($data);
登入後複製

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

unset($data[‘file’]);
登入後複製

6、saveAll新增多條數據,傳回物件清單

 $user = new User;
 $data = [
     [
         &#39;name&#39; => &#39;安阳&#39;,
         &#39;age&#39; => 20,
         &#39;email&#39; => &#39;123456@qq.com&#39;
     ],
     [
         &#39;name&#39; => &#39;小柒&#39;,
         &#39;age&#39; => 25,
         &#39;email&#39; => &#39;ap555@qq.com&#39;
     ]
 ];
 $res = $user->allowField([&#39;name&#39;, &#39;age&#39;])->saveAll($data);
登入後複製
六、更新操作

1、update 傳回影響行數

 $res = User::where([&#39;id&#39;=>1])->update([&#39;name&#39;=>&#39;安阳&#39;]);
登入後複製

2、setField 單獨更新某個欄位

User::where(&#39;id&#39;,1)->setField(&#39;name&#39;,&#39;安阳&#39;);
登入後複製

3、setInc

//setInc(&#39;money&#39;,10)表示将money字段加上10
User::where([&#39;id&#39;=>1])->setInc(&#39;money&#39;, 10);
登入後複製

4、setDec

//setDec(&#39;money&#39;,10)表示将money字段减去10
User::where([&#39;id&#39;=>1])->setDec(&#39;money&#39;, 10);
登入後複製

5、批次更新,要求資料含有主鍵,返回更新物件清單

$user = new User;
$res = $user->saveAll([
     [&#39;id&#39;=>1, &#39;name&#39; => &#39;安阳&#39;],
     [&#39;id&#39;=>2, &#39;name&#39; => &#39;小柒&#39;]
 ]);
登入後複製

七、刪除操作

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

$res = User::destroy(1);
登入後複製

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

 $res = User::destroy([&#39;name&#39;=>&#39;安阳&#39;]);
登入後複製

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

 $res = User::where([&#39;id&#39;=>1])->delete();
登入後複製

八、交易

1、自動控制事務處理

Db::transaction(function(){ 
    Db::table(&#39;order&#39;)->where([&#39;id&#39;=>1])->delete(); 
	Db::table(&#39;user&#39;)->where(&#39;id&#39;=>1)->setInc(&#39;money&#39;,10);	
});
登入後複製

2、手動控制交易

Db::startTrans();//启动事务
try {
    Order::where([&#39;id&#39;=>1])->delete();
	User::where(&#39;id&#39;=>1)->setInc(&#39;money&#39;,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 &#39;男&#39;;
            case 2:
                return &#39;女&#39;;
            default:
            return &#39;未知&#39;;
		}
	}
   //获取器:格式化时间戳后返回
    public function getUpdateTimeAttr($val){
        if(!empty($val)){
			//如果是时间戳,就格式化
			if(!strtotime($val)) {
				return date(&#39;Y-m-d H:i:s&#39;,$val);
			}else{
				return $val;
			}
        }else{
			return &#39;&#39;;
		}
    }
}
登入後複製
補充說明: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 === &#39;&#39;) {
            return $val;
        }else{
            return md5($val.$data[&#39;email&#39;]);
        }
    }
}
登入後複製

十一、model模型的自动完成

auto 新增及更新的时候,自动完成的属性数组
insert 仅新增的时候,自动完成的属性数组
update 仅更新的时候,自动完成的属性数组

1、自动完成

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
	//添加和修改时,都会自动完成的字段
    protected $auto = [&#39;addtime&#39;];

    public function setAddtimeAttr(){
        return time();
    }
}
登入後複製

2、添加数据时,自动完成

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

    public function setAddtimeAttr(){
        return time();
    }
}
登入後複製

3、更新数据时,自动完成:

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

    public function setAddtimeAttr(){
        return time();
    }
}
登入後複製

十二、自动完成时间戳

在数据库配置文件database.php中,有下列这项配置:

//自动写入时间戳字段
&#39;auto_timestamp&#39;  => 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 = &#39;addtime&#39;;//修改默认的添加时间字段
    protected $updateTime = &#39;updtime&#39;;//修改默认的修改时间字段
    protected $updateTime = false;//当不需要这个字段时设置为false
}
登入後複製

Thinkphp更新时,自动更新update_time字段时间戳的方法:

1、使用update

User::update([&#39;name&#39;=>&#39;安阳&#39;],[&#39;id&#39;=>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([&#39;name&#39;=>&#39;安阳&#39;],[&#39;id&#39;=>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 = &#39;deltime&#39;;
}
登入後複製

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();
登入後複製

推荐学习:《PHP视频教程

以上是一文詳解Thinkphp5中怎麼增刪改查資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

php如何使用CodeIgniter4框架? php如何使用CodeIgniter4框架? May 31, 2023 pm 02:51 PM

PHP是一種非常流行的程式語言,而CodeIgniter4是一種常用的PHP框架。在開發Web應用程式時,使用框架是非常有幫助的,它可以加速開發過程、提高程式碼品質、降低維護成本。本文將介紹如何使用CodeIgniter4框架。安裝CodeIgniter4框架CodeIgniter4框架可以從官方網站(https://codeigniter.com/)下載。下

如何使用寶塔面板進行MySQL管理 如何使用寶塔面板進行MySQL管理 Jun 21, 2023 am 09:44 AM

寶塔面板是一種功能強大的面板軟體,它可以幫助我們快速部署、管理和監控伺服器,尤其是經常需要進行網站搭建、資料庫管理以及伺服器維護的小型企業或個人用戶。在這些任務中,MySQL資料庫管理在許多情況下都是一個重要的工作。那麼如何使用寶塔面板進行MySQL管理呢?接下來,我們將逐步介紹。第一步:安裝寶塔面板在開始使用寶塔面板進行MySQL管理之前,首先需要先安裝寶塔面

如何使用PHP腳本在Linux環境下進行資料庫操作 如何使用PHP腳本在Linux環境下進行資料庫操作 Oct 05, 2023 pm 03:48 PM

如何使用PHP在Linux環境下進行資料庫操作在現代web應用程式中,資料庫是必不可少的組成部分。 PHP是一種流行的伺服器端腳本語言,它可以與各種資料庫互動。本文將介紹如何在Linux環境下使用PHP腳本進行資料庫操作,並提供一些具體的程式碼範例。步驟1:安裝必要的軟體和依賴項在開始之前,我們需要確保在Linux環境下安裝了PHP和相關的依賴項。通常情況下

如何使用thinkorm來提高資料庫操作效率 如何使用thinkorm來提高資料庫操作效率 Jul 28, 2023 pm 03:21 PM

如何使用thinkorm來提高資料庫操作效率隨著互聯網的迅速發展,越來越多的應用程式需要進行大量的資料庫操作。在這個過程中,資料庫操作的效率問題就變得特別重要。為了提高資料庫操作效率,我們可以使用thinkorm這個強大的ORM框架來進行資料庫操作。本文將介紹如何使用thinkorm來提高資料庫操作效率,並透過程式碼範例來說明。一、什麼是thinkormthi

MySQL中如何使用FULL OUTER JOIN函數取得兩個表的並集 MySQL中如何使用FULL OUTER JOIN函數取得兩個表的並集 Jul 26, 2023 pm 05:45 PM

MySQL中如何使用FULLOUTERJOIN函數取得兩個表的並集在MySQL中,FULLOUTERJOIN函數是一種融合內連接和外連接的功能強大的連接操作。它可以用來取得兩個表的並集,即將兩個表中的所有資料合併為一個結果集。本文將介紹FULLOUTERJOIN函數的用法,並提供一些範例程式碼以幫助讀者更好地理解。 FULLOUTERJOIN函數

使用PDO進行資料庫操作:PHP的一個更好的方式 使用PDO進行資料庫操作:PHP的一個更好的方式 Jun 21, 2023 pm 01:36 PM

使用PDO進行資料庫操作:PHP的一個更好的方式在Web開發中,使用資料庫進行資料儲存、管理和查詢是非常常見的。而PHP作為一種廣泛應用於Web開發的語言,自然也提供了豐富的資料庫操作方式。在PHP中,可以使用MySQLi、PDO以及其他擴充程式庫來進行資料庫操作。其中,PDO是一種非常常用的資料庫操作方式,相較於其他方式有較多的優點。本文將介紹什麼是PDO,以

如何在Symfony框架中使用Doctrine ORM進行資料庫操作 如何在Symfony框架中使用Doctrine ORM進行資料庫操作 Jul 29, 2023 pm 04:13 PM

如何在Symfony框架中使用DoctrineORM進行資料庫操作引言:Symfony框架是一個流行的PHP框架,它提供了許多強大的工具和元件,用於快速而簡單地建立Web應用程式。其中一個關鍵的元件是DoctrineORM,它提供了一種優雅的方式來處理資料庫操作。本文將詳細介紹在Symfony框架中如何使用DoctrineORM來進行資料庫操作。我們將

PHP後台設計:資料庫操作與資料互動實踐 PHP後台設計:資料庫操作與資料互動實踐 Jan 19, 2024 am 10:31 AM

在開發一個網站、應用程式或系統時,資料庫的操作和資料的互動是必不可少的。而PHP作為一種常用的後台開發語言,其資料庫操作和資料互動能力也是非常強大的。本文將介紹一些PHP常用的資料庫操作函數以及資料互動的實務。同時,我們將結合程式碼範例來講解這些操作和實踐,方便讀者更好地理解和應用。一、資料庫連接在進行資料庫操作前,首先需要連接到資料庫。在PHP中,我們可以使用

See all articles