`
lyunabc
  • 浏览: 551478 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Yii Framework 开发教程(26) 数据库-Active Record示例

 
阅读更多

使用Java或是.Net 写数据库应用,很多人都用过Hibernate(或NHibernate)可以大大简化数据库编程,而以对象的方式来读写数据库(ORM),Yii提供的Active Record (AR) 也是一个流行的 对象-关系映射 (ORM) 技术。每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行。 常见的 CRUD 操作作为 AR 的方法实现。因此,我们可以以一种更加面向对象的方式访问数据。

这里修改Yii Framework 开发教程(24) 数据库-DAO 示例,看看使用Active Record如何读取Employee表。

要访问一个数据表,我们首先需要通过集成CActiveRecord定义一个 AR 类。 每个 AR 类代表一个单独的数据表,一个 AR 实例则代表那个表中的一行。

由于 AR 类经常在多处被引用,我们可以导入包含 AR 类的整个目录,而不是一个个导入。 例如,如果我们所有的 AR 类文件都在protected/models目录中,我们可以配置应用如下:

'import'=>array(
	'application.models.*',
	),

本例定义Employee类如下:

class Employee extends CActiveRecord
{
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	public function tableName()
	{
		return 'Employee';
	}
}

数据表行中列的值可以作为相应 AR 实例的属性访问。比如 $employee->EmployeeId 可以访问Employee的EmployeeId字段。

本例只是读取Employee表,修改SiteController的indexAction方法:

public function actionIndex()
{

	$model = Employee::model()->findAll();

	$this->render('index', array(
		'model' => $model,

		));
}

可以看到只要一行代码 Employee::model()->findAll()就实现读取数据库表并赋值功能,来看看对应的显示记录的代码:

<?php foreach($model as $employee)
{

	echo 'EmployeeId:' . $employee->EmployeeId . '<br />';
	echo 'First Name:' . $employee->FirstName . '<br />';
	echo 'Last Name:' . $employee->LastName . '<br />';
	echo 'Title:' . $employee->Title . '<br />';
	echo 'Address:' . $employee->Address . '<br />';
	echo 'Email:' . $employee->Email . '<br />';
	echo '---------------------- <br />';
}

 ?>

可以看到使用AR可以通过数据库表的字段名(区分大小写)直接访问某个字段值,而无需在类Employee定义,从而大大简化代码。
在前面介绍Model时说过CModel有两个子类,一个是FormModel,另外一个就是CActiveRecord,CActiveRecord定义了数据库访问的CRUD方法,比如

创建记录

要向数据表中插入新行,我们要创建一个相应 AR 类的实例,设置其与表的列相关的属性,然后调用save()方法完成插入

$employee=new Employee;
$employee->FirstName='James';
$employee->LastName='Shen';
...
$employee->save();

如果表的主键是自增的,在插入完成后,AR 实例将包含一个更新的主键。如果一个列在表结构中使用了静态默认值(例如一个字符串,一个数字)定义。

读取记录

要读取数据表中的数据,我们可以通过如下方式调用find系列方法中的一种

// 查找满足指定条件的结果中的第一行
$post=Post::model()->find($condition,$params);
// 查找具有指定主键值的那一行
$post=Post::model()->findByPk($postID,$condition,$params);
// 查找具有指定属性值的行
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// 通过指定的 SQL 语句查找结果中的第一行
$post=Post::model()->findBySql($sql,$params);

如上所示,我们通过Post::model()调用find方法。 请记住,静态方法model()是每个 AR 类所必须的。 此方法返回在对象上下文中的一个用于访问类级别方法(类似于静态类方法的东西)的 AR 实例。

如果find方法找到了一个满足查询条件的行,它将返回一个Post实例,实例的属性含有数据表行中相应列的值。 然后我们就可以像读取普通对象的属性那样读取载入的值,例如echo $post->title;

如果使用给定的查询条件在数据库中没有找到任何东西,find方法将返回 null 。

调用find时,我们使用$condition$params指定查询条件。此处$condition可以是 SQL 语句中的WHERE字符串,$params则是一个参数数组,其中的值应绑定到$condation中的占位符。

更新记录

在 AR 实例填充了列的值之后,我们可以改变它们并把它们存回数据表。

$post=Post::model()->findByPk(10);
$post->title='new post title';
$post->save(); // 将更改保存到数据库

删除记录

如果一个 AR 实例被一行数据填充,我们也可以删除此行数据

$post=Post::model()->findByPk(10); // 假设有一个帖子,其 ID 为 10
$post->delete(); // 从数据表中删除此行

注意,删除之后, AR 实例仍然不变,但数据表中相应的行已经没了

其它可以参见Yii中文文档,这里不再详细复述了。
本例显示结果:
201212127004本例下载


分享到:
评论

相关推荐

    yii2-save-relations-behavior, 验证并保存相关的Active Record 模型.zip

    yii2-save-relations-behavior, 验证并保存相关的Active Record 模型 Yii2 Active Record 保存关系行为自动验证和保存相关的Active Record 模型。 特性支持 hasMany() 和 hasOne() 关系现有的相关模型一起工作支持...

    yii-advanced-app-2.0.36.tgz

    Yii 2 Advanced Application 是一个基于 Yii 2 框架的高级项目模板,适用于构建复杂的、多应用的 Web 应用程序。版本号 2.0.36 表示这是该框架的一个稳定版本,提供了许多改进和修复。这个 `.tgz` 文件是该模板的...

    yii-advanced-app-2.0.10.tgz

    这个版本是“yii-advanced-app-2.0.10.tgz”,它是一个压缩包,包含了 Yii 2 框架的高级应用模板,版本号为 2.0.10。这个版本可能包含了一些修复和改进,以提供更稳定和高效的开发环境。 Yii 2 是一个基于组件的高...

    yii1-ueditor-ext-1.1

    Yii1-UEditor-Ext-1.1 是一个专为Yii框架1.x版本设计的扩展插件,它将流行的富文本编辑器——百度UEditor整合到了Yii应用中。这个组件的目的是提供一个易于使用且功能丰富的文本编辑工具,使得开发者在处理用户内容...

    yii-advanced-app-2.0.4

    "yii-advanced-app-2.0.4" 是 Yii 2.0 框架的一个高级应用模板,适用于构建复杂的多层应用程序。这个版本是 2.0.4,意味着它包含了该框架在 2.0 主线版本中的第四次更新,通常会包含修复的错误、改进的性能以及可能...

    yii2-file-upload-master.zip

    Yii2.0是一个基于组件的高性能PHP框架,用于开发Web 2.0应用程序。这个"yii2-file-upload-master.zip"压缩包包含了一个针对Yii2.0框架的图片上传扩展,特别设计来支持异步加载缩略图功能。这种功能在现代网页应用中...

    Yii Framework 1.1.6

    2. **数据库支持**:Yii提供了一个强大的Active Record组件,使得操作数据库记录变得简单。它支持多种数据库,如MySQL、PostgreSQL、SQLite等,并且兼容PDO(PHP Data Objects)。 3. **缓存机制**:Yii内置了多种...

    yii-basic-app-2.0.5.tgz

    "yii-basic-app-2.0.5.tgz" 是一个压缩包,其中包含了Yii2框架的基础版(Basic App)的源代码,版本号为2.0.5。这个版本修复了一个重要的安全问题,具体涉及到`yii\web\ViewAction`类。 `yii\web\ViewAction`是Yii2...

    Yii Framework API手册

    Yii Framework API手册是针对开发者的一款详尽参考资料,它包含了Yii框架的所有核心组件、类库以及扩展的使用方法和接口信息。Yii是一个高性能、基于组件的PHP框架,用于开发Web 2.0应用。API(Application ...

    yii-docs-2.0-zh-cn.tar.gz

    这个"yii-docs-2.0-zh-cn.tar.gz"压缩包包含了Yii 2.0框架的中文离线HTML版文档,使得开发者无需互联网连接也能查阅详尽的指导和API参考。同时,它还提供了英文版本的离线HTML文档以及"yii-guide-2.0-zh-cn"官方中文...

    yii扩展--ip地址识别--QQWRY

    YII扩展 IP地址识别组件 采用QQWRY数据库 使用条件: 解压到相应的目录。 确定QQWRY.DAT 放入 protacted/data 确定IpLocation 放入 protacted/components 修改main.php 'components'=&gt;array( //......

    YII Framework框架教程之使用YIIC快速创建YII应用详解

    主要介绍了YII Framework框架教程之使用YIIC快速创建YII应用的方法,详细分析说明了YII Framework框架使用YIIC命令行创建应用的相关技巧与注意事项,需要的朋友可以参考下

    yiren-p8Yii-ve2467575-x64.apk

    yiren-p8Yii-ve2467575-x64.apk

    yii-advanced-app-2.0.11.tgz

    这个名为 "yii-advanced-app-2.0.11.tgz" 的压缩包包含了所有必要的文件和配置,使得开发者可以快速地搭建起基于Yii 2的多层架构项目。 Yii 2.0框架是Yii框架的最新迭代,它在性能、安全性和可扩展性方面都有显著...

    YII 2数据库迁移(Migrations) 使用教程

    ### YII 2数据库迁移(Migrations) 使用教程 #### 一、数据库迁移概念与作用 在软件开发过程中,随着项目的推进和技术需求的变化,数据库结构往往也需要进行调整或更新。为了更好地管理和跟踪这些变更,YII 2框架...

    YiiFramework

    - 数据库支持:支持多种数据库,如MySQL、PostgreSQL、SQLite等,并提供了Active Record模式,方便数据库操作。 - 错误和异常处理:提供了一套强大的错误和异常处理机制,确保应用在出现问题时能够优雅地处理。 -...

    yii-basic-app-2.0.36.tgz

    4. **数据库支持**:Yii2提供了强大的Active Record ORM(对象关系映射),支持多种数据库系统,包括MySQL、PostgreSQL、SQLite等。 5. **RESTful API**:Yii2支持轻松构建RESTful Web服务,便于移动应用和其他服务...

    yii-basic-app-2.0.0.tgz

    在"yii-basic-app-2.0.0.tgz"这个压缩包中,我们看到的是Yii 2.0框架的基础应用模板。这个模板是专门为初学者和快速原型设计准备的,包含了创建一个基本Web应用所需的所有基础结构。它提供了一个起点,开发者可以在...

    yii framework 中文完全手册

    3. **数据库操作**:Yii提供了Active Record模式,使得数据库操作更加面向对象,简化了数据查询和更新。 4. **缓存**:内置多种缓存策略,如文件缓存、APC缓存、Memcached和Redis支持,提高了应用性能。 5. **安全...

Global site tag (gtag.js) - Google Analytics