TP5模型不完全解读

正式介绍ORM之前我们需要了解

第一个原因原生的SQL语句没有使用查询构建器等简洁方便;第二个是主要原因,查询数据器封装了对不同数据库的操作,提供给开发者统一的SQL操作语法,不需要关心原生SQL的差异性
链式方法的where方法有三种写法,表达式、数组法(不建议使用)、闭包法。
开启SQL日志信息记录可以帮助分析写数据库查询语句是否足够的好,在性能调优以及找错误有很大的帮助。生产环境一般不要开启该SQL日志记录

模型

1、复杂的模型可能对应多个对象或者多个数据表的,不是一一对应的,简单的模型会产生一个假象,即一个模型对应一个数据库的表,
2、模型的作用主要是用来处理比较复杂的业务逻辑。模型是根据业务逻辑来划分的,简单地说就是根据功能来划分。
3、模型更加关注业务逻辑,而不是数据库查询。模型是可以划分多层的,TP5推荐12划分的有model层、service层、logic层
4、Db是数据库访问层,模型是建立在数据库访问层上一个更加抽象的处理业务逻辑层

  • 模型定义

    • 模型都要继承thinkphp的model这个类
    • 业务足够简单,所以会有一个数据表对应一个模型的假象。不是在所有情况下,表和模型是一一对应的,有可能一个模型对应多个表,比如关联模型就是和多张表都有关联的。关联模型相当于数据库的主表和从表的概念
    • 默认情况下,数据表名和我们的模型是一一对应的,如Banner模型和Banner表,如果不想要一致对应,则可以在Banner模型下指定数据库中的表
  • 静态调用还是实例调用

TP5建议使用静态调用:
第一个原因,静态方法调用更为简洁;
第二个原因从模型的本质意义上来讨论,当你实例化出模型对象后该对象才会对应数据表下的记录,只有把类实例化了才能代表一个事物。这里呢,如果我们先实例化一个对象其实就是数据了,然后又使用get方法去获取数据,就是通过数据再获取数据,显得多余。而静态调用,就是把模型类当做一张表,获取数据的过程就是相当于在数据表中查找数据一样,这样比较好理解。这里也只是为了编程逻辑的完整性和合理性,不过还是可以任意选择一种,看个人习惯

  • 几种查询动词的总结

get、find、all、select
get和find是一个记录或一个模型对象,all和select则是一组记录或一组模型对象。
模型对象可以用以上四种查询动词,但是Db类只能使用find和select。因为Db是模型的基石,模型的内部最终还是要依赖Db来完成对数据库的访问等操作

  • ORM(object relation mapping)

1.模型和数据库访问层,模型是用来处理业务的,而数据库访问层就是用来查询数据库的。模型是建立在Db即数据库访问层之上的。
2.不要因为模型的性能稍差就放弃使用模型。
3.使用面向对象的思维来使用和设计模型。
4.模型的底层仍然是数据库访问抽象层,模型的强大可以自动地调用数据库访问抽象层。

  • 模型性能

模型的性能肯定比原生的SQL稍差,无可否认。在性能要求上差距可以允许的范围内,性能稍差是可以接收的。
绝大多数中小企业对性能的要求没那么高,所以使用ORM模型的方式是可以走的通的,如果你的产品到了很高的量级,对性能要求有一定限制,比如高并发等可以不使用ORM模型的方式,转而写原生SQL语句是可以的

模型关联

关联关系通常有一个参照模型,这个参照模型我们一般称为主模型(或者当前模型),关联关系对应的模型就是关联模型,关联关系是指定义在主模型中的关联关系,有些关联关系还会设计到一个中间表的概念,但中间表不一定需要存在具体的模型。关联模型本身也是一个普通的独立模型,具备模型的所有功能。两个模型之间的关联关系就是通过关联方法来定义的

有一点需要注意的是,关联方法的命名规范是驼峰法,而关联属性则一般是小写+下划线的方式,系统在获取的时候会自动转换对应,读取user_profile关联属性则对应的关联方法应该是userProfile

  • 一对一关联

hasOne(‘关联模型名’,‘外键名’,‘主键名’,[‘模型别名定义’],‘join类型’);
belongsTo(‘关联模型名’,‘外键名’,‘关联表主键名’,[‘模型别名定义’],‘join类型’);

// User 模型
namespace app\index\model;

use think\Model;

class User extends Model 
{
   public function profile()
   {
       return $this->hasOne('Profile','uid');
   }
}
// Profile 模型
namespace app\index\model;

use think\Model;

class Profile extends Model 
{
    public function user()
    {
        return $this->belongsTo('User');
    }
}
  • 一对多关联

hasMany(‘关联模型名’,‘外键名’,‘主键名’,[‘模型别名定义’]);

//文章模型
namespace app\index\model;

use think\Model;

class Article extends Model 
{
    public function comments()
    {
        return $this->hasMany('Comment','art_id');
    }
}
//评论模型
name app\index\model;

use think\Model;

class Comment extends Model 
{
    public function article()
    {
        return $this->belongsTo('article');
    }
}
  • 多对多关联

belongsToMany(‘关联模型名’,‘中间表名’,‘外键名’,‘当前模型关联键名’,[‘模型别名定义’]);

//用户表
namespace app\index\model;

use think\Model;

class User extends Model 
{
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
}
//角色表
namespace app\index\model;

use think\Model;

class Role extends Model 
{
    public function users()
    {
        return $this->belongsToMany('User');
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章