Blogger Information
Blog 40
fans 1
comment 0
visits 32447
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
数据库与模型的初学习
李明伟的博客
Original
621 people have browsed it

数据库的连接方法——

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


Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!