thinkphp5 模型对数据库的操作

392 阅读2分钟

模型定义

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
}

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


模型名     约定对应数据表(假设数据库的前缀定义是 think_)
User      think_user
UserType  think_user_type

模型设置

默认主键为id,如果你没有使用id作为主键名,需要在模型中设置属性:

<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $pk 'uid';
}

新增

第一种是实例化模型对象后赋值并保存:

 $user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

也可以直接传入数据到save方法批量赋值:

$user = new User;
$user->save([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);

或者直接在实例化的时候传入数据

$user = new User([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();

如果需要过滤非数据表字段的数据,可以使用:

$user new User;
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save($_POST);

如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:

$user new User;
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save($_POST);

Replace写入


$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->replace()->save();

获取自增ID

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
// 获取自增ID
echo $user->id;

添加多条数据

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

saveAll方法新增数据返回的是包含新增模型(带自增ID)的数据集对象。

还可以直接静态调用create方法创建并写入:

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

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

create方法的第二个参数可以传入允许写入的字段列表(传入true则表示仅允许写入数据表定义的字段数据),例如

// 只允许写入name和email字段的数据
$user User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
], ['name''email']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

更新

查找并更新

在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式。

$user = User::get(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

对于复杂的查询条件,也可以使用查询构造器来查询数据并更新


$user = User::where('status',1)
 ->where('name','liuchen')
 ->find();
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。如果你需要强制更新数据,可以使用下面的方法:

$user = User::get(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->force()->save();

直接更新数据

$user = new User;
// save方法第二个参数为更新条件
$user->save([
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com'
],['id' => 1]);

上面两种方式更新数据,如果需要过滤非数据表字段的数据,可以使用:

$user new User;
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save($_POST,['id' => 1]);

批量更新数据

$user = new User;
$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']);

删除当前模型

删除模型数据,可以在查询后调用delete方法。

$user = User::get(1);
$user->delete();

根据主键删除

User::destroy(1); // 支持批量删除多个数据 User::destroy('1,2,3'); // 或者 User::destroy([1,2,3]);

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

条件删除

还支持使用闭包删除,例如:


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

或者通过数据库类的查询条件删除

User::where('id','>',10)->delete();

查询

// 取出主键为1的数据
$user User::get(1);
echo $user->name;

// 使用查询构造器查询满足条件的数据
$user User::where('name''thinkphp')->find();
echo $user->name;

获取多个数据

// 根据主键获取多个数据
$list User::all('1,2,3');
// 或者使用数组
$list User::all([1,2,3]);
// 对数据集进行遍历操作
foreach($list as $key=>$user){
    echo $user->name;
}

要更多的查询支持,一样可以使用查询构造器:

// 使用查询构造器查询
$list User::where('status'1)->limit(3)->order('id''asc')->select();
foreach($list as $key=>$user){
    echo $user->name;
}

使用查询构造器

在模型中仍然可以调用数据库的链式操作和查询方法,可以充分利用数据库的查询构造器的优势。

User::where('id',10)->find(); User::where('status',1)->order('id desc')->select(); User::where('status',1)->limit(10)->select();

获取某个字段或者某个列的值

// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
// 以id为索引
User::where('status',1)->column('name','id');
count     User::count();   获取数据总条数     

 max       User::max('字段名')   获取指定字段值的最大值

 sum       User::sum('字段名')   获取指定字段值的总和

 avg       User::avg('字段名')   获取指定字段值的平均值 

min       User::min('字段名') 获取指定字段值的最小值 

都可以和where条件合作