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对象经过一下步骤:

[php] view plaincopy

  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的一些操作。

时间: 2024-08-05 19:13:52

YII框架分析笔记4:ar模型和db的相关文章

YII框架分析笔记2:组件和事件行为管理

Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫 hook),$_m数组存放行为(behavior). 组件管理 YII是一个纯oop框架,很多类中的成员变量的受保护或者私有的,CComponent中利用php中的魔术方法__get(),__set()来访问和设置属性,但这些方法的作用远不指这些.下面用__get()来说明 [php] vi

YII框架分析笔记3:表单模型和验证

表单模型CFormModel绝大部分继承CModelCModel,由于表模型数据不需要持久化,所以主要在验证操作上.下面以框架脚手架生成的网站登录为例说明表单模型. [php] view plaincopy //模型中的验证规则 public function rules() { return array( array('username, password', 'required'), array('rememberMe', 'boolean'), array('password', 'aut

YII框架分析笔记10:日志

yii框架中日志组件记录的等级5类,在CLogger已通过常量定义: const LEVEL_TRACE='trace'; const LEVEL_WARNING='warning'; const LEVEL_ERROR='error'; const LEVEL_INFO='info'; const LEVEL_PROFILE='profile'; CLogger为所有日志写入和获取提供接口,通过日志路由管理类CLogRouter将日志分发到不同日志展现或存储介质中. 日志组件配置 [php]

YII框架分析笔记8:CDataProvider

CDataProvider,顾名思义,数据提供者,它提供了三个抽象方法(fetchData,.fetchKeys 和 calculateTotalItemCount),分别为调用不同数据结构的数据提供了获取数据.获取键值.获取数量的,接口,在YII框架 中,CActiveDataProvider.CArrayDataProvider.CSqlDataProvider是它的子类,除了提供数据之外, 他还提供分页和排序功能.下面以获取数据fetchData()为例 CActiveDataProvid

YII框架分析笔记6:视图

YII框架使用的view是在原生的php模板上进行扩展的.CController中对视图的渲染有多种方法: render($view,$data=null,$return=false)//连同layout一起渲染 renderPartial($view,$data=null,$return=false,$processOutput=false)//不渲染layout renderText($text,$return=false)//渲染静态内容和layout renderDynamic($cal

YII框架分析笔记5:控制器和动作

CBaseController是控制器和挂件的基类,主要提供了视图渲染,挂件,剪辑.片段缓存等方法,CController是所有应用中自定义控制器的基类. 创建动作 [php] view plaincopy public function run($actionID) { if(($action=$this->createAction($actionID))!==null) { if(($parent=$this->getModule())===null) $parent=Yii::app()

YII框架分析笔记1:YII执行流程

yii整体执行流程直观,具体由以下步骤: 1.程序入口文件index.php加载yii框架引导程序(bootstrap)文件yii.php,加载配置文件以及其他自定义配置. 2.yii.php中Yii类继承了YiiBase,主要封装框架的一些通用方法,比如自动加载.创建组件.核心类路径映射.记录日志以及调试等,YiiBase.php中注册自动加载方法.另外Yii类预留可以自定义一些方法作为扩展. 3.回到index.php,Yii::createWebApplication($config),创

YII框架分析笔记9:url路由

以创建url路由为例,从CWebApplication执行请求过程说起,如果在配置中设置了catchAllRequest,所有请求将会定位到配置中的路由中,否则的需要CUrlManager的parseUrl()方法解析解析url获取路由. [php] view plaincopy /** * Parses the user request. * @param CHttpRequest $request the request application component * @return str

YII框架分析笔记12:主题管理

YII主题的控制由CThemeManager和CTheme管理,CThemeManager在应用初始化时作为核心组件注册,主题默认路径是app/themes/. 主题配置 由于主题组件在应用初始化时注册,其配置以及很方面,比如在app/themes/下有一个custom1主题 在主配置文件中加入'theme'=>'custom1'键值对,在主题注册的时候会调用 CWebApplication::setTheme($value)初始化主题的名字. 获取主题 主题的获取从控制器渲染视图说起,通过视a