第七章 笔记(数据库访问与ORM)

(目前仅供自用笔记)
1.TP5支持4中数据库类型,常用mysql
TP5常用的3种查询方式:

  1. 使用原生sql语句查询数据库
  2. 使用构造器来操作数据库
  3. 使用模型以及关联模型操作数据库(主要)
    写框架代码和写业务代码,出发点不一样,使用的方式不一样,一个只是想着实现单一特定的功能就可以了,但是框架需要考虑的是框架的适用性和通用性,更多的使用面向对象和设计模式相关知识。
    在这里插入图片描述
<?php
namespace app\api\model;
use think\Db;
use think\Exception;

class Banner
{
    public static  function getBannerByID($id)
    {
    //$result = Db::query('select * from banner_item where banner_id = ?',[$id]);
    //hui.com/api/v1/banner/1?XDEBUG_SESSION_START=10979

//        $result = Db::table('banner_item')->where('banner_id','=',$id)->find();
        //查询出一个一维数组
        //table和where只是一个对象,只会返回一个Query对象,称为辅助方法(链式方法),不同的链式方法没有先后顺序,但是相同的可能会生成不同的sql语句
        //数据库操作方法(find,select,update,insert,delete)
        
//        $result = Db::table('banner_item')
//            ->where('banner_id','=',$id)
//            ->select();
        
        
        //非链式(操作不方便)
//        Db::table('banner_item');
//        Db::where('banner_id','=',$id);
//        DB::where();
//        ...
//        $result = DB::select();
        //执行操作后,整个对象会被清除

        //where('字段名','表达式','查询条件');
        //表达式、数组法(官方说不灵活,不安全)、闭包
        $result = Db::table('banner_item')
            ->where(function ($query) use ($id){
                $query->where('banner_id','=',$id);
            })
        ->select();
    return $result;
    }
}

在这里插入图片描述

使用模型

<?php
namespace app\api\model;
use think\Db;
use think\Exception;
use think\Model;

class Banner extends Model
{
    public static  function getBannerByID($id)
    {
    //$result = Db::query('select * from banner_item where banner_id = ?',[$id]);
    //hui.com/api/v1/banner/1?XDEBUG_SESSION_START=10979

//        $result = Db::table('banner_item')->where('banner_id','=',$id)->find();
        //查询出一个一维数组
        //table和where只是一个对象,只会返回一个Query对象,称为辅助方法(链式方法),不同的链式方法没有先后顺序,但是相同的可能会生成不同的sql语句
        //数据库操作方法(find,select,update,insert,delete)

//        $result = Db::table('banner_item')
//            ->where('banner_id','=',$id)
//            ->select();


        //非链式(操作不方便)
//        Db::table('banner_item');
//        Db::where('banner_id','=',$id);
//        DB::where();
//        ...
//        $result = DB::select();
        //执行操作后,整个对象会被清除

        //where('字段名','表达式','查询条件');
        //表达式、数组法(官方说不灵活,不安全)、闭包
        $result = Db::table('banner_item')
//            ->fetchSql()
            ->where(function ($query) use ($id){
                $query->where('banner_id','=',$id);
            })
        ->select();
        //ORM Obeject Relation Mapping 对象关系映射(把一个表单当做一个对象,操作的是一个对象,对象与对象之间的作用关系,面向对象)
        //模型(中小型项目建议使用模型,而非原生sql或者Db)
        //最简单就是一个对象,不单单是完成数据库的查询,
        //还包含相关的业务逻辑,并不仅仅是对象的集合,
        //还是一个业务的集合,模型的主要作用就是处理一些复杂的业务逻辑,
        //模型可能是对应多个表,也可能是对应多个对象,
        //模型是根据功能划分的,tp5中模型不单单是model一层,可以划分为多层model、service等等
        //Db属于数据库访问层,model模型是建立在数据库访问层之上更加抽象的处理业务逻辑的模型层
    return $result;
    }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	public function getBanner($id)
	{
	    //正常情况下,3句话搞定
		(new IdIsInt())->batch()->goCheck();
//        $banner = BannerModel::getBannerByID($id);
        $banner = BannerModel::get($id);//返回一个对象
        if (!$banner){
            throw new BannerMissException();
//            throw new Exception('内部错误');
        }
//        return json($banner,200);
        return $banner;
   }

在这里插入图片描述在这里插入图片描述
ORM返回的是对象,不是数组
返回的对象优势在于可以有更多的方法和属性来操作它(这是tp5已经封装好的),且不用json()序列化,在tp5中设置'default_return_type' => 'json',可以直接转换成json格式输出

//        $banner = BannerModel::getBannerByID($id);
          $banner = BannerModel::get($id);//返回一个对象
//        get,find,all,select
//        get和all是模型特有的方法
//        find和select是Db特有的,且模型也可以使用,模型层在数据访问层之上

        //实例化对象调用
//        $banner = new BannerModel();//模型对象对应的是数据库中的一条数据记录
//        $banner = $banner->get($id);//用这条具体的记录再找另外一个具体记录,合理性较弱
//        静态调用:
        //优  1.调用起来更加简洁,不需要实例化模型对象(例:直接通过BannerModel类的方式来调用get方法获取到想要的结果)
        //优  2.模型的本身意义上来考虑,类对应到数据库中的一张表,然后再找一条数据,更加合理
        //劣   对编程思想不利,不清楚里面逻辑调用原理

Db原生和ORM性能对比(相同查询条件下)

  1. 项目访问量或查询数据足够大,需要第一考虑性能的话,推荐Db原生写法
  2. 若是中小型或者可以在一定程度上牺牲性能的情况下,可以使用ORM,省时,且性能有一部分可以利用硬件来提升
  3. 相比较,优化sql语句是更好的选择
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值