zoukankan      html  css  js  c++  java
  • YII框架分析笔记4:ar模型和db

    YII中实现两种类型的模型,分别是表单模型和活动记录。在持久化数据方面,YII只实现了活动记录,对于复杂的数据关系可以用框架提供的DAO来自己写model,对应集成doctrine这样的ORM还没有仔细研究过。

    ar模型
    框架中的model是CModel子类,CModel主要是一些验证与错误处理,并实现迭代器和数组访问接口,活动记录模型CActiveRecord是AR模型的基类。

    每个AR类代表一个单独的数据表,一个AR实例则代表那个表中的一行。AR是一种对象关系映射(ORM)的设计模式,它负责数据持久化. 封装了数据库CURD操作,同时它是一种领域模型(Domain Model), 封装了部分业务逻辑。一个AR类中包括了表结构(Table Schema),约束以及 CURD
    实例化model有两种方法,直接new一个新的实例,或者用静态方法mode(),后者与前者的区别是略过构造函数执行的代码(主要是避免元数据的多次获取),用静态方法mode()创建ar对象经过一下步骤:

    1. //$model::model($class)  
    2. $model=self::$_models[$className]=new $className(null);//创建一个mode实例   
    3. new CActiveRecordMetaData($model)//创建元数据类  
    4. //1、获取表模式实例  
    5. $model->getDbConnection() //获取数据库连接  
    6. ->getSchema()//获取数据库schema  
    7. ->getTable($tableName)//获取表shema  
    8. ->loadTable()//获取表对象  
    9. ->findColumns()//获取表中列对象以及其中的约束  
    10. ->findConstraints()//获取表约束(代码实际上是外键关系)  
    11. //2、主键配置  
    12. //3、添加关系(关系包括BELONGS_TO、HAS_ONE、HAS_MANY、MANY_MANY、STAT)  
    13. $model->attachBehaviors($model->behaviors());//添加行为  

    上 面流程下来会遇到一个问题,每一次创建model都会执行"SHOW COLUMNS FROM $tableName"和"SHOW CREATE TABLE $tableName"的查询,在高并发下会影响性能。可以在主配置文件中的数据库配置中添加schemaCachingDuration和 schemaCacheID的配置来缓存数据库schema,前者是设置缓存的时间,后者是缓存组件的id,但缓存带来的问题是修改数据库中表结构不能立 即生效,所以在生产环境下写一个刷新缓存的脚本是又必要的。

    DAO
    ar模型带来的好处是将开发中SQL语句的编写减到最小,ar模型既封装了数据库记录的状态和持久化到数据库的访问方 法,也封装了业务逻辑,这在关系不是很复杂的应用中带来的好处显而易见,但如果数据库关系复杂,业务逻辑复杂,有必要将对数据的操作单独提出来,YII中 的DAO就是将业务逻辑和数据交换分开,也降低了业务和数据库的耦合性。
    YII中DAO基于PDO,统一的接口可以访问不同的数据库管理系统。在框架中CDbConnection、CDbCommand、CdbDataReader、CDbTransaction类分别管了数据量的连接、命令、读取和事务。

    YII还对数据库的schema进行映射,一个数据库是对应一个对象,一个表对应一个对象,一列对应一个对象,这些对象分别封装其对应schema的一些操作。

  • 相关阅读:
    ubuntu17.10 源
    _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed
    shell | crontab 定时任务
    python将负数转为16进制无符号数
    vooya --- a YUV player and a generic raw data player
    clion 查看代码 多次查看后如何一步一步回退到最初查看的代码位置
    Unity3d XmlException: Text node cannot appear in this state的方案
    Unity2017灯光烘焙知识点
    unity加载ab后,场景shader不起效问题(物件表现黑色)
    BMFont制作美术字体
  • 原文地址:https://www.cnblogs.com/sunscheung/p/4827122.html
Copyright © 2011-2022 走看看