数据库访问与ORM

1、数据库操作三种方式之原生SQL

database.php

<?php

return [
    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => '127.0.0.1',
    // 数据库名
    'database'        => 'zerg',
    // 用户名
    'username'        => 'root',
    // 密码
    'password'        => '123456',
    // 端口
    'hostport'        => '3306',

application\api\model\Banner.php

<?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]);
        return $result;
    }
}

2、从一个错误了解Exception 的继承关系

z.cn/aoi/v1/banner1?XDEBUG_SESSION_START=10518
报错ExceptionHandler::render() must be an instance of think\Exception, instance of think\exception\HttpException given
于是乎分别从Think/Exception think\exception\HttpException找到他们的父类\exceeption,然后在ExceptionHandler里面修改Excetion,use think/exception =》 /Exception

3、tp5数据库中间架构解析

这里写图片描述
Db:数据库操作的入口对象;连接数据库。原生
Collection:连接器
Query:查询器;很优雅的,对原生的语句进行封装。
Builder:编译器;编译Query生成原生语句。
同一个标准的Query查询器,用不同标准的Builder生成器来解析Query查询器,从而来适配不同的数据库

7-4查询构造器1

<?php
/**
 * Created by PhpStorm.
 * User: lihua
 * Date: 2017/11/5
 * Time: 13:41
 */

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]);
//        return $result;
        $result = Db::table('banner_item')
            ->where('banner_id','=',$id)
            ->select();//find();//find,update,delete,insert.

    }
}

1、find返回的是一条记录的所有属性
select返回满足条件的所有数据
2、链式方法:不会真正的实现query语句,每一个链式方法调用之后实现query对象,所以可以添加任意多的辅助方法。无论添加多少的链式方法,最中国总会是返回query对象。
3、query对象里面在调用该真正的执行方法(select等),才会真正生成sql语句。
4、不同的链式方法没顺序,但是相同的要注意下。

5、常见的链式方法

连贯操作 作用 支持的参数类型
where* 用于AND查询 字符串、数组和对象
whereOr* 用于OR查询 字符串、数组和对象
wheretime* 用于时间日期的快捷查询 字符串
table 用于定义要操作的数据表名称 字符串和数组
alias 用于给当前数据表定义别名 字符串
field* 用于定义要查询的字段(支持字段排除) 字符串和数组
order* 用于对结果排序 字符串和数组
limit 用于限制查询结果数量 字符串和数字
page 用于查询分页(内部会转换成limit) 字符串和数字
group 用于对查询的group支持 字符串
having 用于对查询的having支持 字符串
join* 用于对查询的join支持 字符串和数组
union* 用于对查询的union支持 字符串、数组和对象
view* 用于视图查询 字符串、数组
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数
relation* 用于关联查询 字符串
with* 用于关联预载入 字符串、数组
bind* 用于数据绑定操作 数组或多个参数
comment 用于SQL注释 字符串
force 用于数据集的强制索引 字符串
master 用于设置主服务器读取数据 布尔值
strict 用于设置是否严格检测字段名是否存在 布尔值
sequence 用于设置Pgsql的自增序列名 字符串
failException 用于设置没有查询到数据是否抛出异常 布尔值
partition 用于设置分表信息 数组 字符串

6、

    $result = Db::table('banner_item')
        ->where('banner_id','=',$id)
        ->select();//find,update,delete,insert.
    Db::table('a');
    Db::where('condi');
    Db::where();
    Db::select();//直到select出现上边的才会执行
    $result1 = Db::.......;//和第一条语句没有关系

7、where的三中方法

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

7、开启SQL日志记录

一个特殊的链式方法fetchsql(),不会执行,只会返回sql语句

        $result = Db::table('banner_item')
            ->fetchSql()
            ->where(function ($query) use ($id){
                $query->where('banner_id','=',$id);
            })
            ->select();

config.php


    'log'                    => [
        // 日志记录方式,内置 file socket 支持扩展
        'type'  => 'test',
        // 日志保存目录
        'path'  => LOG_PATH,
        // 日志记录级别
        'level' => ['sql'],
    ],

index.php

\think\Log::init([
    'typr' => 'File',
    'path' => LOG_PATH,
    'level' =>['sql']
]);

8、ORM与模型

Object Relation Mapping 对象关系映射
模型

9、初识模型

DB属于数据库访问层
model模型不是数据库访问层,它是建立在数据库访问层上边的一个更高的抽象的处理业务逻辑的模型层
\v1Banner.php

<?php

    namespace app\api\controller\v1;

    use app\api\validate\IDMustBePostiveInt;
    use app\api\model\Banner as BannerModel;
    use app\lib\exception\BannerMissException;
    use app\lib\exception\BaseException;
    use think\Exception;

    class Banner
    {
        public function getBanner($id){
            (new IDMustBePostiveInt()) -> goCheck();

                $banner = BannerModel::get($id);//模型法
//                $banner = BannerModel::getBannerByID($id);
                if (!$banner){
                    throw new BannerMissException('');
                }

            return $banner;
        }
    }

修改config.php

    // 默认输出类型
    'default_return_type'    => 'json',

10、模型定义总结

controller\v1\Banner.php

<?php

    namespace app\api\controller\v1;

    use app\api\validate\IDMustBePostiveInt;
    use app\api\model\Banner as BannerModel;
    use app\lib\exception\BannerMissException;
    use app\lib\exception\BaseException;
    use think\Exception;

    class Banner
    {
        public function getBanner($id){
            (new IDMustBePostiveInt()) -> goCheck();

                $banner = BannerModel::get($id);
                if (!$banner){
                    throw new BannerMissException('');
                }

            return $banner;
        }
    }

model\Banner.php

<?php

namespace app\api\model;


use think\Db;
use think\Exception;
use think\Model;

class Banner extends Model
{
   protected $table = 'category';
    public static function getBannerByID($id){
        $result = Db::table('banner_item')
            ->where(function ($query) use ($id){
                $query->where('banner_id','=',$id);
            })
            ->select();
        return $result;

    }
}

模型的类名和数据库表名相对应,如需修改则直接protected $table = ‘category’;

新建模型的方法 在Terminal 里面输入命令php think make:model api/BannerItem

11、静态调用还是实例对象调用

//                $banner = BannerModel::get($id);//静态 调用
                $banner = new BannerModel();
                $banner = $banner->get($id);//实例对象调用

12、几种查询动词的总结

get find select all
get find 一个 select all一组
get all 是模型所特有的 DB下边不可用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值