数据库的连接方法——
使用静态连接的方法,通过修改配置目录下的database.php文件实现对数据库的连接(可以直接修改也可以使用ENV环境变量实现进行配置)
以下是配置文件——
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' => '[email protected]',
'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' => '[email protected]',
'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);
}