ThinkPHP5小程序笔记(二)

TP5数据库

惰性连接,节省资源;TP5中使用查询构造器不使用原生sql的好处是,TP5编写了一套规范,语法简单的查询构造器,这是第一点,第二点是当我们使用其他类型的数据库时我们无需更改sql语句,框架自动切换到改数据库类型的sql语法;
无论使用哪种查询都要使用Db::类,table和where属于链式方法(辅助方法),select和find才是真正的查询方法,包括update、delete、insert这5个都是数据库的执行方法;链式方法是不会主动去数据库进行操作,只有你调用了查询方法才会真正的去执行sql语句;
where条件三种方式:表达式、数组、闭包

//闭包式
$result = Db::table('banner_item')
            ->fetchSql()//打印当前sql语句
            ->where(function ($query) use ($id) {
                $query->where('banner_id','=',$id);
            })
            ->select();

开启SQL日志记录

在前面我们已经关闭了框架的自动记录日志,手动有选择的开启了程序错误的记录日志以避免不必要得错误信息浪费资源,那么SQL的记录日志有助于我们更清楚看到执行sql语句,所以打开方式是在入口页,这样一来避免所有的错误都被记录二来只要访问框架那么所有执行的SQL语句将都被记录日志;

//初始化sql记录日志 只记录sql执行日志
\think\Log::init([
    'type' => 'File',
    'path' => LOG_PATH,
    'level' => ['sql']
]);

ORM(Object Relation Mapping)对象关系映射

ORM思想简单来说就是要用面向对象的一种思维方式来思考数据表,在传统的sql语句里面并没有把表当做是一个对象,我们把它理解的就是一个二维的数据结构,那么我们用ORM就要把数据表当做一个对象去处理,那么我们在操作的时候就不是操作数据表而是对象;
ORM它不是一种具体的语言也不是框架,而是一种思想,那么不同的语言以及不同的框架他都会去实现自己的ORM对象关系映射模型;
那么模型主要的作用就是处理一些复杂的逻辑以及数据表的数据,ORM思想是把一个表当做对象去处理,而模型它可能对应多个对象同时对应多个表的。模型它和对象、表之间没有必然联系,模型是根据自己的业务逻辑来划分的,也就是根据功能划分;

模型

get、find、all、select:find和select是Db的特有查询方法,get和all是模型特有的查询方法,使用Db查询时不能使用get和all,但是使用模型查询时这四种都可以使用,因为Db是模型的基石,两者是不能分离的,在模型的内部最终去访问数据库的时候还是使用的Db来完成的;

关联模型,嵌套关联模型

首先模型对应的数据表是有外键关联的,然后在主表模型中新建一个方法来关联模型,在模型中使用hasMany方法来关联其他模型;最后查询出来的结果是多维数组,相当于SQL的多表联查;
Banner模型(数据表间关系一对多BannerItem)

class Banner extends Model {
  //hasMany是一对多的关系方法;
  public function items() {
        //被关联的模型类名,被关联模型的外键,Banner模型的主键
        return $this->hasMany('BannerItem','banner_id','id');
  }
}

BannerItem模型(数据表间关系一对一Image)
belongsTo和hasOne的区别:如果当前模型里面存在外键字段那么使用belongsTo关系方法,反过来如果当前模型没有外键,外键是存在他相关联的模型里面那么就使用hasOne关系方法;

class BannerItem extends Model
{
    //belongsTo是一对一的关系方法;
    public function img() {
        //被关联的模型类名,被关联模型的外键,BannerItem模型的主键
        return $this->belongsTo('Image','img_id','id');
    }
}

Image模型

class Image extends Model
{
}

控制器中调用with方法并传入关联方法名称,中括号可传入嵌套模型,如果只有一个关联模型,那么可以省去中括号
白话理解:如果我要查询Banner模型那么必须with(具有)BannerItem(也就是items关联方法)同时BannerItem下还关联有Image模型

use app\api\model\Banner as BannerModel;
class Banner {
  public function getBanner($id) {
    $result = BannerModel::with(['items','items.img'])->find($id);
    //隐藏字段
    $result->hidden(['id']);
    //显示字段
    $result->visible(['id']);
  }
}

开启路由完整匹配模式

TP5中路由设置基本相同但参数不同可能会导致路由导向错误,如下例子:

Route::get('api/:version/theme','api/:version.Theme/getSimpleList');
Route::get('api/:version/theme/:id','api/:version.Theme/getComplexOne');

这个时候就需要开启路由使用完整匹配,在config文件更改route_complete_match配置为true;

你可能感兴趣的:(ThinkPHP5小程序笔记(二))