- 1 第一个应用 Hello World
- 2 Yii Web 应用基础
- 3 为应用添加日志
- 4 Hangman 猜单词游戏实例
- 5 URL 管理
- 6 CComponent 组件
- 7 使用 CHtml 创建 Form
- 8 使用 FormModel
- 9 UI 组件 Widget 概述
- 10 UI 组件 自定义组件
- 11 UI 组件 ActiveForm 示例
- 12 UI 组件 ClipWidget 示例
- 13 UI 组件 ContentDecorator 示例
- 14 UI 组件 MaskedTextField 示例
- 15 UI 组件 MultiFileUpload 示例
- 16 UI 组件 StarRating 示例
- 17 UI 组件 TabView 示例
- 18 UI 组件 TextHighlighter 示例
- 19 UI 组件 TreeView 示例
- 20 UI 组件 Captcha 示例
- 21 UI 组件 自定义 Captcha 示例
- 22 UI 组件 Zii 组件简介
- 23 数据库-概述
- 24 数据库-DAO 示例
- 25 数据库-Query Builder 示例
- 26 数据库-Active Record 示例
- 27 数据库-关联 Active Record 示例
- 28 Data Provider 简介
- 29 Zii 组件-Menu 示例
- 30 Zii 组件-ListView 示例
- 31 Zii 组件-DetailView 示例
- 32 Zii 组件-GridView 示例
- 33 Zii 组件-Accordion 示例
- 34 Zii 组件-AutoComplete 示例
- 35 Zii 组件-Button 示例
- 36 Zii 组件-DatePicker 示例
- 37 Zii 组件-Dialog 示例
- 38 Zii 组件-ProgressBar 示例
- 39 Zii 组件-Slider 示例
- 40 Zii 组件-SliderInput 示例
- 41 Zii 组件-Tabs 示例
- 42 Zii 组件-Draggable 示例
- 43 Zii 组件-Droppable 示例
- 44 Zii 组件-Resizable 示例
- 45 Zii 组件-Selectable 示例
- 46 Zii 组件-Sortable 示例
- 47 主题 Theme 示例
- 48 多国语言示例
26 数据库-Active Record 示例
Contents
1 创建记录
2 读取记录
3 更新记录
4 删除记录
使用 Java 或是.Net 写数据库应用,很多人都用过 ibernate(或 NHibernate)可以大大简化数据库编程,而以对象的方式来读写数据库(ORM),Yii 提供的 Active Record (AR) 也是一个流行的 对象-关系映射 (ORM) 技术。每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行。 常见的 CRUD 操作作为 AR 的方法实现。因此,我们可以以一种更加面向对象的方式访问数据。
这里修改 数据库-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 中文文档 ,这里不再详细复述了。
本例显示结果:
图片 26.1 picture26.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论