使用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中文文档,这里不再详细复述了。
本例显示结果:
本例下载
分享到:
相关推荐
yii2-save-relations-behavior, 验证并保存相关的Active Record 模型 Yii2 Active Record 保存关系行为自动验证和保存相关的Active Record 模型。 特性支持 hasMany() 和 hasOne() 关系现有的相关模型一起工作支持...
yii2高级多应用脚手架,下载yii-advanced-app-2.0.36.tgz直接使用开发,下载不了的朋友可以方便下载使用
官网原版,供不方便下载的开发者使用
yii-advanced-app-2.0.4 下载
Yii Framework API手册 英文原版
Yii Framework 1.1.6 框架
YII2.0的中文离线html版,还有YII2.0的英文离线html版和yii-guide-2.0-zh-cn 官方中文文档PDF,请点头像自行下载,谢谢
Yii2框架basic版本,修复了 yii\web\ViewAction 类中的安全问题。
特征同时支持hasMany()和hasOne()关系适用于现有以及新的相关模型支持复合主键仅使用纯Active Record API,因此它可以与任何数据库驱动程序一起使用从1.5.0版开始,相关记录现在可以与主模型一起删除 :warning: 从...
下载自https://github.com/KolyaSirik/yii2-image-manager-mongo. 听说GFW要升级2.0.顺手下载以供后续备用。
yii framework框架 + yii app模板(基本、高级)
yiren-p8Yii-ve2467575-x64.apk
yiren-p8Yii-v17323.apk
Yii2.0-图片上传扩展(异步加载缩略图) [扩展组件]
YII框架翻译整理最终稿-大部分来源于yii官方网站,但是有部分说明不太清晰,并且部分翻译没有,本人进行了翻译补全,整理成了此文档。方便阅读。
yii-basic-app-2.0.7
Yii2 ScrollToTop 按钮小部件 基于。 安装 作曲家 安装此扩展的首选方法是通过 。 要么跑 php composer.phar require uran1980/yii2-scroll-to-top "dev-master" 或添加 "uran1980/yii2-scroll-to-top": "dev-...
yii2基础脚手架,下载yii-basic-app-2.0.36.tgz直接使用开发,下载不了的朋友可以方便下载使用
yii2-assets-auto-compress, js css html的自动编译 自动编译和合并 css html在项目中的文件。这个解决方案使你能够动态地组合js和css文件来优化html页面。 这样可以提高google页面速度的性能。这里工具仅适用于真实...