模型定义
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $pk = 'uid';//默认主键是id,如果不是需要绑定
protected $table = 'cms_user';//绑定数据表
// 设置当前模型的数据库连接(当你的数据库链接不是配置中链接时设置。)
protected $connection = [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => false,
];
}
模型调用
模型类可以使用静态调用或者实例化调用两种方式
- 在模型中调用
// 静态调用
$user = User::get(1);//$user = $this->get(3);一样的效果,都是调用本类的方法
$user->name = 'thinkphp';
$user->save();
// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
// 使用 Loader 类实例化(单例)==>需要引入locader类,`use think\Loader;`
$user = Loader::model('User');
// 或者使用助手函数`model`也是单例
$user = model('User');
$user->name= 'thinkphp';
$user->id = 3;
$user->save();
- 在控制器调用模型
//引入此model类
use app\index\model\User;//==》如果模型名和控制名一样的话需要设置别名。use app\index\model\User as UserModel;
//在方法中实例化
$user = new User;
//调用实例方法
$user->user_name= 'thinkphp';
return $user->save();
//当然也可以使用loader函数,只需在头部引入即可`use think\Loader;`
添加数据
- 实例化模型对象后赋值并保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
此种方式有个缺陷,就是字段值不能和Model里面的成员属性(比如class,具体看think\Model.php)一样,否则会赋值不上,版本5.0.10,已提出问题,不知道后期会不会优化。
- data
$user = new User;
$user->data([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
- 直接在实例化的时候传入数据
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
- 过滤非数据表字段的数据
$user = new User($_POST);
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save();
- 指定某些字段写入
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();
- 静态方法
还可以直接静态调用create方法创建并写入:
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID
获取自增ID
- 出入数据获取自增id
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
// 获取自增ID
echo $user->id;//这里的id是主键,如果主键是user_id,那就是$user->user_id
注意不要在同一个实例里面多次新增数据,如果确实需要多次新增,因为当新增数据时,$user里面的字段值都是此条的数据,当你再次添加时,会造成当前数据部分值被替换,而且还存在主键。。。所以那不是新增数据,当然系统也会报错,那么可以用下面的方式:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
$user->name = 'onethink';
$user->email = 'onethink@qq.com';
// 第二次开始必须使用下面的方式新增
$user->isUpdate(false)->save();
- 添加多条数据
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
saveAll方法新增数据返回的是包含新增模型(带自增ID)的数据集(数组)。
修改数据
修改数据和新增数据差不多一个道理,系统会根据数据或者条件自动识别是新增还是修改
- 实例化模型后调用save方法表示新增;//存在主键会报错,当批量时可以设置saveAll的第二个参数为false
- 查询数据后调用save方法表示更新;//因为查询后此实例带有主键值
- save方法传入更新条件后表示更新;
批量更新仅能根据主键值进行更新,其它情况请使用foreach遍历更新。
删除当前模型
- delete
delete
方法需要查询再删除,如果不查询想通过主键删除的话需要添加where条件,否则会报‘添加条件’错误
$user = User::get(1);
$user->delete();
//或者
$user->where('id',1)->delete();
- destroy
destroy
不能使用其他连贯操作,如果使用的话会报method not exist:think\db\Query->destroy
错误,具体请看destroy和delete函数的区别。但是可以在传递参数时设置条件,同时也支持闭包
User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
//条件:id>:id
User::destroy(['id'=>['>',$id]]);
//闭包
User::destroy(function($query) use($id){
$query->where('id','>',$id);
});
V5.0.9+版本开始当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
查询
- 获取单个数据 get
取出主键为1的数据
$user = User::get(1);
echo $user->name;
// 使用数组查询
$user = User::get(['name' => 'thinkphp']);
// 使用闭包查询
$user = User::get(function($query){
$query->where('name', 'thinkphp');
});
echo $user->name;
/在模型中,User::可以$this->;如User::get(1)和$this->get(1)一样
get方法也是不能使用连贯操作的,而且需要传递参数
如果你是在模型内部,请不要使用$this->name的方式来获取数据,请使用$this->getAttr('name') 替代。因为可能会和model类的成员属性重复。
- 查询单个 find
$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
->find();
- 获取多个数据 all
// 根据主键获取多个数据
$list = User::all('1,2,3');
// 或者使用数组
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
echo $user->name;
}
// 使用数组查询
$list = User::all(['status'=>1]);
// 使用闭包查询
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user->name;
}
数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯操作,包括排序、数量限制等。
- 获取多个数据 select
$user = new User();
// 查询数据集
$user->where('name', 'thinkphp')
->limit(10)
->order('id', 'desc')
->select();
虽然说返回的结果集是一个数组对象,但是不影响遍历(也不影响在模板中遍历),直接像处理3.2一样处理
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user['id'].':'.$user->name.'<br />';
}
- 获取某个字段或者某个列的值
// 获取某个用户的积分(返回值:字符串)
User::where('id',10)->value('score');
// 获取某个列的所有值(返回值:数组)
User::where('status',1)->column('name');
// 以id为索引)(返回值:数组)
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField
动态查询
// 根据name字段查询用户
$user = User::getByUserName('new1');//
// 根据email字段查询用户
$user = User::getByEmail('thinkphp@qq.com');
默认按照数据表从上到下的顺序查询第一条复合的数据,如果需要排序则添加连贯操作
数据分批处理
处理大量数据的时候使用
User::chunk(100,function($users){
foreach($users as $user){
// 处理user模型对象
}
});
查询缓存
get方法和all方法的第三个参数表示是否使用查询缓存,或者设置缓存标识。
$user = User::get(1,'',true);
$list = User::all('1,2,3','',true);
由于第二个参数是关联预载入定义,V5.0.6+版本开始,可以直接在第二个参数传入true表示开启查询缓存。