首先开启调试
// 应用配制文件
// 开启应用调试模式
'app_debug' => true,
// 开启应用
Trace'app_trace' => true,
'log' => [
// 日志记录方式
'type' => 'File',
// error和sql日志单独记录
'apart_level' => ['error','sql'],
],
// 数据库配制文件
'debug' => true,
定义模型
主要目的:
定义数据表(默认类名)及主键(自动获取)
定义数据处理逻辑(包括属性和方法)及业务逻辑(方法)
namespace app\index\model;
use think\Model;
class User extends Model{
}
注意:
数据字段自动获取,支持缓存
模型不支持前缀
Model类名 | 表名 |
---|---|
User | think_user |
UserType | think_user_type |
数据库符合命名规范,则不用定义 table 与name
// table 完整表名
protected $table = 'user_info';
// name 无前缀表名
protected $name = 'user_info';
开启应用类库后缀后,类名加model
'class_suffix' => true,
namespace app\index\model;
use think\Model;
class UserModel extends Model{
}
调用
// 实例化User模型
$user = new \app\index\model\User();
// 直接静态查询
$user = \app\index\model\User::get(1);
// 助手函数调用
$user = model('User');
Db类 与 模型 的CURD
所有的链式方法都可以直接被模型类静态调用,而且一样不分先后次序
总结
用法 | 模型(动态)值 | Db类 | 模型(静态) |
---|---|---|---|
创建 | insert | save | create |
更新 | update | save | update |
读单个 | find | find | get |
读多个 | select | select | all |
删除 | delete | delete | destroy |
Create
静态调用(个人倾向)
模型类的静态CURD操作其实都是内部自动实例化
$user = User::create([
'name' => 'thinkphp',
'email' => '[email protected]',
]);
echo $user->id;
方法 | 返回值 |
---|---|
save(动态) | 影响的记录数 |
create(静态) | 模型对象实例 |
//Db用法
Db::table('user')
->insert([
'name' => 'thinkphp',
'email' => '[email protected]',
]);
// 模型用法
$user = new User;
$user->name = 'thinkphp';
$user->email = '[email protected]';
$user->save();
// 批量设置
$user = new User;
$user->save([
'name' => 'thinkphp',
'email' => '[email protected]',
]);
Read
原则上模型的查询都应该是静态调用
方法 | 作用 | 返回值 |
---|---|---|
get | 查询单个记录 | 模型对象实例 |
find | 查询单个记录 | 模型对象实例 |
all | 根据主键查询多个记录 | 包含模型对象实例的数组或者数据集 |
select | 根据条件查询多个记录 | 包含模型对象实例的数组或者数据集 |
$user = User::get(1);
echo $user->id;
echo $user->name;
// Db类,查询用户数据集
$users = Db::table('user')
->where('id', '>', 1)
->limit(5)
->select();
// 遍历读取用户数据
foreach ($users as $user) {
echo $user['id'];
echo $user['name'];
}
// 模型,查询用户数据集
$users = User::where('id', '>', 1)
->limit(5)
->select();
// 遍历读取用户数据
foreach ($users as $user) {
echo $user->id;
echo $user->name;
}
// 多主键
Db::table('user')->select([1,2,3]);
$users = User::all([1, 2, 3]);
Update
方法 | 作用 | 返回值 |
---|---|---|
save | 更新数据 | 影响的记录数 |
update | 更新数据(静态) | 返回模型对象实例 |
// Db实现
Db::table('user')
->where('id', 1)
->update([
'name' => 'topthink',
'email' => '[email protected]',
]);
// 模型实现
$user = User::get(1);
$user->name = 'topthink';
$user->email = '[email protected]';
$user->save();
$user = User::get(1);
$user->save([
'name' => 'topthink',
'email' => '[email protected]',
]);
User::update([
'name' => 'topthink',
'email' => '[email protected]',
], ['id' => 1]);
数据集
通过判空
$resultSet = User::all();
if (0 == count($resultSet)) {
echo '数据集为空';
}
分页
$total = User::where('status', 1)->count();
$list = User::where('status', 1)
->paginate(20, $total);
业务
控制器调用模型,模型类封装“业务逻辑”和“数据处理”
// controller
public function register(){
return $this->fetch();
}
public function doRegister(User $user){
$data = $this->request->param();
$result = $user->register($data);
if ($result) {
$this->success('用户注册成功');
} else {
$this->error($user->getError());
}
}
// model (好优雅,有没有)
/**
* 注册一个新用户
* @param array $data 用户注册信息
* @return integer|bool 注册成功返回主键,注册失败-返回false
*/
public function register($data = []){
$result = $this->validate(true)->allowField(true)->save($data);
if ($result) {
return $this->getData('id');
} else {
return false;
}
}
- 依赖注入直接把模型对象实例注入到控制器的操作方法中,而不需要每次都进行实例化。
// 关于如何使用依赖注入,请参考《控制器从入门到精通》第五讲