数据库的连接方法——
使用静态连接的方法,通过修改配置目录下的database.php文件实现对数据库的连接(可以直接修改也可以使用ENV环境变量实现进行配置)
以下是配置文件——
<?php use \think\facade\Env; return [ // 数据库类型 'type' => Env::get('database_type'), // 服务器地址 'hostname' => Env::get('database_hostname'), // 数据库名 'database' => Env::get('database_database'), // 用户名 'username' => Env::get('database_username'), // 密码 'password' => Env::get('database_password'), // 端口 'hostport' => '', // 连接dsn 'dsn' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => Env::get('database_charset'), // 数据库表前缀 'prefix' => '', // 数据库调试模式 'debug' => Env::get('database_debug'), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 自动读取主库数据 'read_master' => false, // 是否严格检查字段是否存在 'fields_strict' => true, // 数据集返回类型 'resultset_type' => 'array', // 自动写入时间戳字段 'auto_timestamp' => false, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 是否需要进行SQL性能分析 'sql_explain' => false, // Builder类 'builder' => '', // Query类 'query' => '\\think\\db\\Query', // 是否需要断线重连 'break_reconnect' => false, // 断线标识字符串 'break_match_str' => [], //自定义连接配置 'my_db' => [ //数据库类型 'type' => 'mysql', //服务器地址 'hostname' => '127.0.0.1', //数据库名 'database' => 'tp51', //用户名 'username' => 'root', //密码 'password' => 'root', ] ];
以下是.env文件中的代码
;应用参数 app_debug = true//开启框架操作时代码运行错误时的错误提示 app_trace = true//开启tp框架自带的控制台 ;数据库的配置信息 database_type = mysql database_hostname = 127.0.0.1 database_database = tp51 database_username = root database_password = root database_charset = utf8 database_debug = true
在静态连接成功后通过Db类中的静态方法对数据库中的数据表进行操作
$res = Db::table('staff')->limit(1)->select();
也可以使用动态连接的方法连接数据库
//使用connect方法动态连接 $res = Db::connect('my_db')->table('staff')->limit(2)->select();
其中的my_db是自定义的连接配置(在database.php中定义)
'my_db' => [ //数据库类型 'type' => 'mysql', //服务器地址 'hostname' => '127.0.0.1', //数据库名 'database' => 'tp51', //用户名 'username' => 'root', //密码 'password' => 'root', ]
还有一种是使用模型连接
use think\Model; class Staff extends Model { protected $table = 'staff';//所用的数据表,默认是与模型名称同名的数据表 protected $pk = 'id';//所用的数据表的主键 //配置连接参数 protected $connection = 'my_db';
控制器中的代码
$res = Staff::limit(4)->select();//可以直接对该模型进行操作
对数据库进行curb操作
数据库的原生查询
——主要思路:先构造一个sql语句,其中的参数使用:加变量名作为数据占位符,然后调用Db类中的query或者execute方法执行sql语句
//数据库的原生查询:query() public function demo2() { //准备sql语句 $sql = 'SELECT `id`,`name`,`age` FROM `staff` WHERE `age`>:age LIMIT :num'; //执行查询操作 $res = Db::query($sql, ['age' => 50, 'num' => 2]); dump($res); } //数据库的原生写操作:execute() public function demo3() { //准备sql语句 $sql = 'UPDATE `staff` SET `salary` = :salary WHERE `id` = :id'; //执行写操作 $res = Db::execute($sql, ['salary' => 5000, 'id' => 3]); dump($res); }
使用查询构造器进行数据库操作
主要思路:使用Db类中自带的数据库操作方法进行数据库的链式操作
find():返回满足条件的第一条记录
vlaue():获取记录中某一个字段中的第一个值
select():返回满足条件的所有记录
colum():返回一个列的值,可以定义查询的列和查询后所得数组的键值
insert():新增的操作,执行新增的操作,成功会返回新增的数量
update():更新的操作
fetchsql():获取当前执行的sql语句的方法
//查询构造器:find()/select() public function demo4() { //find():返回满足条件的第一条记录 $res = Db::table('staff') ->field('id,name,age') ->find(); //获取记录中某一个字段中的第一个值:value() $res = Db::table('staff') ->field('id,name,age') ->where('age', '>', 70) ->value('name'); //select():返回满足条件的所有记录 $res = Db::table('staff') ->field('id,name,age') ->where('age', '>', 70) ->select(); //colum():返回一个列的值 $res = Db::table('staff') ->field('id,name,age') ->where('age', '>', 70) ->column('age', 'name');//colum可以定义查询的列和查询后所得数组的键值 dump($res); } //查询构造器中的新增操作:insert() public function demo5() { $data = [ 'name' => '欧阳锋', 'sex' => 1, 'age' => 59, 'salary' => 8868.58, 'email' => 'ouyangfeng@php.cn', 'mobile' => '15788997652', 'password' => sha1('123456'), 'create_time' => time(), 'update_time' => time(), 'delete_time' => 0, ]; //执行新增的操作,成功会返回新增的数量 $res = Db::table('staff')->data($data)->insert(); dump($res); } //查询构造器:update() public function demo6() { //更新条件 $where['id'] = 21; //更新内容 $data['age'] = 59; $res = Db::table('staff') ->where($where) ->data($data) //->fetchSql()//获取当前执行的sql语句的方法 ->update(); dump($res); } //查询构造器:如何准确的获取查询结果 public function demo7() { // 1.字符串 $res = Db::table('staff') ->field('id,name,age,salary') ->where('age > 50') ->where('salary BETWEEN 5000 AND 8000') ->select(); // 2.表达式 $res = Db::table('staff') ->field('id,name,age,salary') ->where('age', '>', 50) ->where('salary', 'between', '5000,8000')//也可以写作[5000,8000] ->select(); // 3.数组 $where[] = ['age', '>', 50]; $where[] = ['salary', 'between', '5000,8000']; $res = Db::table('staff') ->field('id,name,age,salary') ->where($where) ->select(); // 如果是等值查询 $where = []; $where['id'] = 5; $res = Db::table('staff')->where($where)->find(); dump($res); }
模型查询的curb操作
tp框架中的model类继承了Db类中的方法
常用到的模型类中的方法
get()——返回满足条件的第一条数据,get方法中的参数可以是一个值,也可以是一个闭包函数,其效果与使用查询构造器中的find()方法类似
all()——返回满足条件的所有记录,其效果与使用查询构造器中的select()方法类似
update()——更新操作
create()——新增操作
destory()——删除操作
//模型查询的读操作 public function demo8() { // 1.get()返回满足条件的第一条记录 // 1.1.主键 $res = Staff::get(9); // 1.2查询构造器 $res = Staff::field('id,name,age')->where('age', '>', 90)->find(); // 闭包 $res = Staff::get(function (Query $query) { $query->field('id,name,age')->where('age', '>', 80); }); // 2.all()——获取满足条件的多条记录 // 2.1 all() $res = Staff::all(); // 2.2 all([]) $res = Staff::all([2, 4, 6]); // 2.3查询构造器 $res = Staff::field('id,name,age')->where('age', '>', 90)->select(); dump($res); } //模型的新增操作 public function demo9() { //准备要添加到表中的数据,以数组的方式提供 $data = [ 'name' => '沙通天', 'sex' => 1, 'age' => 39, 'salary' => 2233.58, 'email' => 'shatongtian@php.cn', 'mobile' => '157112347652', 'password' => sha1('123456'), 'creat_name' => time(), 'update_name' => time(), 'delete_time' => 0, ]; //create dump(Staff::create($data)); } //模型的更新与删除 public function demo10() { //id = 22,age //update(更新的字段,更新条件) $createtime = time(); $res = Staff::update(['create_time' => $createtime], ['id' => 22]); $res = Staff::destroy(['id' => 25]); dump($res); }
模型的获取器与修改器
获取器——作用是对模型实例的数据做出自动处理。命名规则get+字段名+Attr,字段名需要使用驼峰命名法
//获取器:命名规则get+字段名+Attr,字段名需要使用驼峰命名法 //性别,getSexAttr固定命名,需要使用驼峰命名法 protected function getSexAttr($value) { return $value ? '男' : '女'; } //获取器:创建时间 protected function getCreateTimeAttr($value) { return date('Y/m/d', $value); } //获取器的第三个参数:代表着当前记录的全部内容 protected function getEmailAttr($value, $data) { return $data['name'] . '的邮箱是:' . $value; } //第二个参数的应用,可以伪装不存在的字段 protected function getInfoAttr($value, $data) { return $data['name'] . '的工资是' . $data['salary']; } 对应的控制器代码—— //获取器的测试 public function demo11() { $res = Staff::get(2); dump($res); $res = $res->info;//获取器的第二个参数的应用 dump($res); }
修改器——对模型设置的数据对象值进行处理(),命名规则与获取器类似
修改器的使用场景和读取器类似:
时间日期字段的转换写入;
集合或枚举类型的写入;
数字状态字段的写入;
某个字段涉及其它字段的条件或者组合写入
//修改器,设置器,针对时间 //命名规则set+字段名+Attr,字段名需要使用驼峰命名法 protected function setCreateTimeAttr($value) { return strtotime($value);//通过修改器实现对用户提供的时间的字符串变为时间戳,strtotime函数实现时间戳的转化 }
控制器代码
//修改器,设置器的测试 public function demo12() { $res = Staff::get(1); $res->create_time = '2019-3-27'; $res->save();//save的方法类似于update方法区别在于save方法有对象调用,是动态方法 dump($res); }