博客列表 >数据库与模型的初学习

数据库与模型的初学习

李明伟的博客
李明伟的博客原创
2019年04月02日 13:16:30627浏览

数据库的连接方法——

使用静态连接的方法,通过修改配置目录下的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);
}


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议