ThinkPHP5-操作数据库(原生|构造器|模型)

原生sql
    $result = Db::query('select * from banner_item where banner_id = ?',[$id]) ;
构造器
    封装了对不同数据库的操作 提供了一种统一操作的语法 不需要关心不同数据库sql语法的差异性
    /**
     * Db::table('banner_item')->where('banner_id','=',$id) 返回Query对象 只有调用了执行方法才会执行语句返回结果
     * 前面的辅助方法或者叫 链式方法 只有调用了find|select|update|delete|insert 才会真正执行sql
     * 构造器 find() 返回一条记录 一维数组   select()返回所有满足记录 二维数组
     */
    $result = Db::table('banner_item')->where('banner_id','=',$id)->select() ;
    <>
    Db::table('banner_item');
    Db::where('banner_id','=',$id) ;
    $result = Db::select() ;
    where('字段名','表达式','查询条件') 表达式为=的时候 可以缺省where('banner_id',$id)
    where有三种 表达式(上述) 数组 闭包(下例)
        $result = Db::table('banner_item')
                ->where(function($query) use ($id) {
                    $query->where('banner_id','=',$id) ;
                })
                ->select() ;
开启SQL日志记录
    调试sql 语句
        1>fetchSql()
            $result = Db::table('banner_item')
                        ->where('banner_id','=',$id)
                        ->fetchSql()
                        ->select() ;
            使用fetchSql() 会打印出当前拼接的sql 语句 不会真正执行
        2>开启sql日志记录  分析sql的运行时间 吞吐率 内存消耗...
            database.php   'debug' => true ,
            config.php      'app_debug'=>true ,
            关闭了自动记录日志 可以在入口文件 初始化
            Log::init([
                'type' => 'File' ,
                'path' => LOG_PATH,
                'level' => ['sql']
            ]);

模型以及关联模型
    ORM思想 Object Relation Mapping 对象关系映射
    传统sql语句查询表  表是一种数据结构(数组 二维数组)
    用ORM 做数据查询的时候  操作的不是表 是对象  对象如何获取数据不需要关心
        如此一来 表与表之间就不是数据结构与数据结构之前 是对象与对象之间的作用关系
    TP5中的模型 是ORM思想实现的一种机制 包含数据查询以及业务逻辑  可以处理复杂的业务逻辑
        例如 对应多个对象 多张表
        模型和表 对象之间没有必然联系 模型是根据自己的业务逻辑(功能)划分的
            业务逻辑简单的话 可能一张表 一个对象 对应一个模型 1<->1
            业务逻辑复杂的话 多张表 多个对象对应一个模型 多<->1
        模型不仅仅是 model一层  model细小粒度的接口 service层很多model的集合 粗粒度接口
    例如 用户登录 比对帐号密码 简单的业务 Db类执行 增删改查 不涉及复杂逻辑
                异地登录 发送短信通知
                多个设备同时登录 (PC端登录 移动端提醒 下线等)
         Db与模型相比不能很好的 包含和处理业务逻辑 Db属于底层数据库访问层 Model类似于建立在数据库访问层之上的处理业务逻辑的模型层
    使用方法
        1>class Banner extends Model  继承think\Model  默认类名对应表名   关联模型一个模型对应多张表(主从表 banner banner_item)
            class Banner extends Model
            {
                protected $table = 'category' ;   //指定 该model对应的表  类名与表名不对应
            }
        2>$banner = BannerModel::get($id) ; 调用父类方法 返回对象
        3>config.php
            // 默认输出类型  html 改成json
            'default_return_type'    => 'json',

        快捷创建模型命令   php think make:model api/BannerItem
                        namespace app\api\model;
                        use think\Model;
                        class BannerItem extends Model
                        {
                            //
                        }
        静态调用还是实例对象调用
            静态调用
                $result = BannerModel::get($id) ;
            实例对象调用
                $banner = new BannerModel() ;
                $result = $banner->get($id) ;
            模型的查询 推荐使用静态调用
                静态调用更加简洁
                数据库的单位是表以及表中的记录 BannerModel这个类对应表
                BannerModel实例化之后的对象对应表中的记录(类[属性 行为]与对象[具体事物])
                逻辑上来说
                BannerModel对应表通过get获取目标记录
                $banner = new BannerModel() ;实例化之后 $banner对应一条记录 一条记录再get() ...
            查询动词
                构造器  find()一条记录 select()多条记录
                模型   get() find()      单个对象
                       all() select()  多个对象
            Db是模型的基础 模型内部最终访问数据库还是数据库访问层Db
            模型和数据库访问层 职责不同 模型主要处理业务 Db数据库操作
            模型性能稍差 相比原生sql
            面向对象的思维设计使用模型
            模型的底层 还是数据库访问层 自动调用
            好的代码第一原则是可读性 使用框架必然有性能损耗 不如原生php快 框架就是一种抽象和封装 有性能损耗

上一篇:thinkphp5用了哪些设计模式


下一篇:phpstudy安装ThinkPHP5框架