Heim  >  Artikel  >  PHP-Framework  >  Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

青灯夜游
青灯夜游nach vorne
2022-02-10 18:22:513632Durchsuche

Thinkphp5中怎么操作数据库,进行增删改查?下面本篇文章就来带大家详细了解一下Thinkphp5中增删改查数据库的方法,希望对大家有所帮助!

Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

thinkphp标准数据表设计:

创建时间字段:create_time

更新时间字段:update_time

删除时间字段:delete_time 

类型选int,如下图:

Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

【相关教程推荐:thinkphp框架

一、创建model的文件夹

在application文件夹下的二级对象目录中新建名为model的文件夹,该文件夹与对应的controller和view目录同级,如下图:

Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

如果有多个模块(比如前台index,后台admin),操作的数据库都差不多,那么可以把model模型放到common公共模块里,如下:

Ein Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt

二、创建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视频教程

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie man die Datenbank in Thinkphp5 hinzufügt, löscht, ändert und abfragt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen