登录  /  注册
博主信息
博文 25
粉丝 1
评论 0
访问量 24643
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
thinkPHP对数据库的CURD操作--20190321
曲小冷
原创
1133人浏览过

thinkPHP对数据库的CURD操作总共有三种:原生、查询构造器、模型

1、原生

    查询 query(select)   

    更新和写入 execute(update/insert) 如果数据非法或者查询错误则返回false,否则返回影响的记录数。

$res = Db::query('select * from staff');
$sql = "update staff set `email`='tmz@php.cn' WHERE  `id` = 11";
$res = Db::execute($sql);
dump($res);

2、查询构造器

首先需要在thinkPHP的 config/database.php 配置文件中配置下数据库的连接数据。

然后通过查询构造器进行操作:

2.1 查询

Db::table('staff')
->where('id',1)    
->find() | ->select() | ->value('name') | ->column('name','id')

find  方法只能查询满足条件的第一条数据,查询结果不存在,返回 null,否则返回结果数组
select   方法查询满足条件所有数据,结果是一个二维数组,如果结果不存在,返回空数组
value   查询某个字段的值  方法查询结果不存在,返回 null
column   查询某一列的值   方法查询结果不存在,返回空数组

2.2 新增

* 添加单条记录

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('staff')
->insert($data) | ->data($data)->insert() | ->strict(false)->insert($data) | ->insert($data, true)
->insertGetId($data)

insert   方法添加数据成功返回添加成功的条数,通常情况返回 1
data  方法传入要添加的数据 数据表里面没有foo或者bar字段,那么就会抛出异常
strict  不存在的字段的值将会直接抛弃
insertGetId  方法添加数据成功返回添加数据的自增主键

* 添加多条数据

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']];
Db::table('staff')
->insertAll($data) | ->data($data)->insertAll()

insertAll  方法添加数据成功返回添加成功的条数
data   方法传入要添加的数据
* 确保要批量添加的数据字段是一致的

2.3 更新

Db::table('staff')
->where('id', 1)    // 数据
->update(['name' => 'thinkphp']) | ->data(['name' => 'thinkphp'])->update()

update 方法返回影响数据的条数,没修改任何数据返回 0
data  方法传入要更新的数据
* 如果update方法和data方法同时传入更新数据,则会进行合并。

* 如果数据中包含主键,可以直接使用:

Db::table('staff')
->update(['name' => 'thinkphp','id'=>1]);
实际生成的代码:UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1

* 更新字段值

Db::table('staff')
->where('id',1)
->setField('name', 'thinkphp')

setField  方法返回影响数据的条数,没修改任何数据字段返回 0

* 自增或自减一个字段的值

Db::table('staff')
->where('id', 1)
->setInc('score') | ->setInc('score', 5)

setInc/setDec  方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)
setInc/setDec  支持延时更新,如果需要延时更新则传入第三个参数,下例中延时10秒更新

Db::table('staff')
->where('id', 1)
->setInc('score', 1, 10)

setInc/setDec  方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true

2.4 删除

Db::table('staff')->delete(1) | ->delete([1,2,3])  
Db::table('staff')->where('id',1)->delete()
Db::table('staff')->delete(true)

delete  方法返回影响数据的条数,没有删除返回 0

2.5 软删除

一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)
// 软删除数据 使用delete_time字段标记删除
Db::table('staff')
->where('id',1)
->useSoftDelete('delete_time',time())
->delete();

useSoftDelete  方法表示使用软删除,并且指定软删除字段为delete_time,写入数据为当前的时间戳。

2.6 链式调用

Db::table('staff')
->field()
->where()
->limit()

table('表名')  用于指定操作的数据表

field('字段1,字段2,...') 字符串 标识要返回或者操作的字段,可以用于查询和写入操作
field(['字段1','字段2','字段N',...]) 数组
field(['字段1','字段2'=>'别名'])  数组方式可以为某些字段定义别名
field(true) 显示获取数据表的所有字段列表

where('字段名','表达式','查询条件') 表达式查询
where(['name'	=>'thinkphp','status'=>	1]) 数组条件查询:关联数组和索引数组
where('type=1 AND status=1')  字符串条件查询

limit(number) 限制结果数量
limit(起始数据,显示条数) 分页查询

order('id', 'desc')  对操作的结果排序或者优先级限制  ORDER BY `id` desc
order(['order','id'=>'desc']) 对多个字段的排序  ORDER BY `order`,`id` desc
  * 如果没有指定desc或者asc排序规则的话,默认为asc

strict(false) 设置是否严格检查字段名

alias('别名') 设置当前数据表的别名

3、模型查询

模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对象化的获取方式。

模型查询一般一个模型是对应着一张表,创建模型并且继承系统的Model模型类库。

模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写 

模型常用的设置属性:

模型设置属性.png

namespace app\index\model;
use think\Model;
class User extends Model{
    // 设置当前模型对应的完整数据表名称
    protected $table = 'staff';
    
    // 设置当前模型的数据库连接
    protected $connection = 'db_config';
    
    // 默认主键为id,如果你没有使用id作为主键名,需要在模型中设置属性
    protected $pk = 'uid';
}

3.1 查询

// 主键查询
$res = User::get(1);
// 查询构造器
$res = User::field('id,name,email')
        ->where('id',5)
        ->find();
// 闭包 必传参数 Query $query
$res = User::get(function (Query $query){
    $query->where('id',7);
});

* 根据主键查询单条数据

$user = User::get(1);  echo $user->name;
$user = User::where('name', 'thinkphp')->find();   echo $user->name;

get(主键值)  查询满足当前主键的数据
模型无论使用get还是find方法查询,返回的是都当前模型的对象实例,如果查询数据不存在,则返回Null,除了获取模型数据外,还可以使用模型的方法。

* 根据主键获取多个数据

$list = User::all('1,2,3') | all([1,2,3])
foreach($list as $key=>$user){
    echo $user->name;
}

all() 没参数则是获取所有数据
all('1,2,3')或all([1,2,3]) 获取主键值为 1,2,3 的数据
*****
User:: 相当于 Db::table(),所以可以使用User::代替Db::table()进行操作--使用查询构造器查询,但是第一个方法一定是静态调用
User::where('status', 1)->limit(3)->order('id', 'asc')->all()

3.2 新增

* 新增单条数据

实例化模型对象后赋值并保存
$user= new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
或  直接传入数据到save方法批量赋值
$user->save([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'])
或   直接在实例化的时候传入数据
$user = new User([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com']);
$user->save();

获取自增ID  echo $user->id;
save 方法返回影响的记录数,并且只有当before_insert事件返回false的时候返回false,从V5.1.6+版本开始统一返回布尔值
* 添加多条数据

$list = [
    ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
    ['name'=>'onethink','email'=>'onethink@qq.com']];
$user->saveAll($list);

saveAll 方法新增数据返回的是包含新增模型(带自增ID)的数据集对象。默认会自动识别数据是需要新增还是更新操作,当数据中存在主键的时候会认为是更新操作,如果你需要带主键数据批量新增,可以使用下面的方式:

$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],];
$user->saveAll($list, false);

** 静态方法

$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

和save方法不同的是,create方法返回的是当前模型的对象实例

3.3 查找和更新

在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式。
$user = User::get(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();

* 查询构造器

$user = User::where('status',1)
->where('name','liuchen')
->find();

* 批量更新数据  

** saveAll 方法批量更新数据,只需要在批量更新的数据中包含主键即可

$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']];
$user->saveAll($list);
批量更新方法返回的是一个数据集对象。批量更新仅能根据主键值进行更新,其它情况请自行处理。

** 静态方法

User::where('id', 1)
    ->update(['name' => 'thinkphp']);
或
User::update(['id' => 1, 'name' => 'thinkphp']);

3.4 删除

* 删除模型数据

$user = User::get(1);
$user->delete();
delete方法返回影响的记录数

* 静态方法(根据主键删除)

User::destroy(1);
User::destroy('1,2,3') | destroy([1,2,3]);

destroy  方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的

* 闭包删除

User::destroy(function($query){
    $query->where('id','>',10);
});

*  如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学