1,TP5的数据库架构
Db: 是TP5操作数据库的入口类。它的作用是为连接数据库做准备,我们只需要在database.php里填写相应的配置即可。
Connection: 是TP5的连接器类,因为TP5支持四种数据库(Mysql,Pgsql,Sqlite,Sqlsrv),所以TP5封装了一个类来提供统一的调用接口来支持我们连接数据库(这里的连接是惰性连接,只有在执行SQL的时候才会真正连接)。
Query: 查询器,因为不同数据库的SQL语句不同,所以封装了一个Query类来提供统一的接口,以实现不同数据库的CURD操作。查询器是TP5数据访问层的核心,它连接了Connection和Builder。
Builder: 生成器。这个类主要是把Query的查询参数生成相应的sql语句,然后把其返回给Connection供其使用。
2, 数据库的访问
在TP5中,对于数据库的访问有三种方法:
- 原生sql语句。
Db::query('select * from think_user where id=?',[8]);
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
- 查询构造器
需要注意的是,上述的查询方法中find,select,insert,update,delete都是查询操作,其他的都是辅助操作,辅助操作返回的是个对象,支持链式调用。但一旦执行了查询操作,就不能继续调用了。
不同的辅助操作先后顺序没影响,但是相同的辅助操作先后顺序会有影响。
不同的辅助操作,先后顺序没影响。
Db::table('banner')->where('id', '>', '2')->order('update_time asc')->select();
Db::table('banner')->order('update_time asc')->where('id', '>', '2')->select();
相同的查询操作,先后顺序有影响。
$list = Db::table('data')
->where('id', '>', 1)
->where('name', 'like', '%think%')
->order('id', 'desc')
->order('create_time', 'desc')
->limit(8)
->select();
$list = Db::table('data')
->where('name', 'like', '%think%')
->where('id', '>', 1)
->order('create_time', 'desc')
->order('id', 'desc')
->limit(8)
->select();
- 模型
ORM Object Relation Mapping 对象关系映射
就是通过模型来映射到我们的数据库中的表,然后通过操作模型来操作数据库。
我们通过和查询构造器对比来看
// 查询操作
$user = Db::table('user')->find(1);
// 取值操作
echo $user['name'];
echo $user['email'];
// 设置操作
$user['name'] = 'topthink';
$user['email'] = 'thinkphp@qq.com';
// 更新操作
Db::table('user')->update($user);
如果是模型操作的话,就可以对应下面的代码实现
// 查询操作
$user = User::get(1);
// 取值操作
echo $user->name;
echo $user->email;
// 设置操作
$user->name = 'topthink';
$user->email = 'thinkphp@qq.com';
// 更新操作
$user->save();
这里是在模型的外部,也就是控制器里的取值和设置操作,但是在模型内部,是使用如下方式:
// 取值操作
echo $user->getData('name');
echo $user->getData('email');
// 设置操作
echo $user->data('name', 'SpawN');
echo $user->data('email', '123@qq.com');
模型的CURD操作
创建
Db 用法:
Db::table('user')->insert([
'name' => 'spawn',
'email' => '123@qq.com'
])
模型用法:
$user = new User;
$user->save([
'name' => 'spawn',
'email' => '123@qq.com'
])
$user = User::create([
'name' => 'sapwn',
'email' => '123@qq.com'
])
总结:
- save(动态) 返回: 影响的记录数
- create(静态) 返回:模型对象实例 (可以直接调用方法)
读取
Db :
$user = Db::table('user')->where('id', 1)->find();
模型:
$user = User::get(1);
需要注意的是,find和select是查询构造器的方法,get和all是模型的方法。但模型又是基于查询构造器的,所以模型可以调用find和select方法,但是查询构造器不能调用get和all方法
总结:
方法 作用 返回值
get 查询单个记录 模型对象实例
find 查询单个记录 模型对象实例
all 根据主键查询多个记录 包含模型对象实例的数组或者数据集
select 根据条件查询多个记录 包含模型对象实例的数组或者数据集
更新
Db :
Db::table('user')->where('id', 1)->update([
'name' => 'haha',
'email' => 'heihei@qq.com'
])
模型:
$user = User::get(1);
$user->save([
'name' => 'haha',
'email' => 'heihei@qq.com'
])
或者
User::update([
'name' => 'topthink',
'email' => 'topthink@qq.com',
], ['id' => 1]);
总结:
方法 作用 返回值
save 更新数据 影响的记录数
update 更新数据(静态) 返回模型对象实例
需要注意的是,模型的更新操作是只更新有变化的数据。性能比较好。
删除
Db:
Db::table('user')->delete(1);
模型:
$user = User::get(1);
$user->delete();
或者
User::destory(1);
总结:
方法 作用 返回值
delete 删除当前数据 影响的记录数
destroy 删除指定数据(静态) 影响的记录数
现在我们已经掌握了模型的基本CURD操作,我们来总结下方法区别:
用法 Db类 模型(动态) 模型(静态)
创建 insert save create
更新 update save update
读取单个 find find get
读取多个 select select all
删除 delete delete destroy
来源:CSDN
作者:qq_35534823
链接:https://blog.csdn.net/qq_35534823/article/details/76993742