Blogger Information
Blog 25
fans 1
comment 0
visits 25224
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
thinkPHP对数据库的CURD操作--20190321
曲小冷
Original
1171 people have browsed it

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静态方法

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post