PHP开发框架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 中的占位符。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 实例
, 方法
, ar9331
, ar
, model
, 数据表
, ction ar
, POST访问
, 一个
, model类
, yii实现model默认值
, AR操作
yii2_rbac实例
yii activerecord、yii2 activerecord、yii2 activerecord in、yii activerecord sql、yii isnewrecord,以便于您获取更多的相关知识。

时间: 2024-10-26 11:00:32

PHP开发框架Yii Framework教程(26) 数据库-Active Record示例的相关文章

PHP开发框架Yii Framework教程(25) 数据库-Query Builder示例

上一篇介绍PHP使用DAO(数据库访问对象接口)访问数据库的方法,使用DAO需要程序员编写SQL语句,对于一些复杂的SQL语 句,Yii提供了Query Builder来帮助程序员生成SQL语句,Query Builder提供了一中面向对象的方法动态创建SQL语句,打个不 十分恰当的比较,PHP 的DAO和.Net 的DAO接口非常类型,Query builder 就有点像LINQ了,尽管和LINQ比起来功能小很多.对 于一些简单的SQL查询,通常不需要借助于Query Builder,比如上篇

PHP开发框架Yii Framework教程(30) Zii组件-ListView示例

CListView可以用来显示列表,CListView支持使用自定义的View模板显示列表的的记录,因此可以非常灵活的显示数据的表 ,这点有点像Android的ListView:-). CListView 支持分页和排序,分页和排序支持使用AJAX实现从而可以提高页面 的响应性能.CListView的使用需要通过DataProvider,通常是使用CActiveDataProvider. 本例修改Yii Framework 开 发教程(26) 数据库-Active Record示例,不过为了显示

PHP开发框架Yii Framework教程(34) Zii组件-AutoComplete示例

CJuiAutoComplete 在用户输入时可以根据用户输入的前几个字符自动提示用户可以输入的文字.它封装了 JUI autocomplete插件. 基本用法如下 <?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array( 'name'=>'city', 'source'=>$data, // additional javascript options for the autocomplete plugin 'op

PHP开发框架Yii Framework教程(33) Zii组件-Accordion示例

Zii组件中包含了一些基于JQuery的UI组件,这些UI组件定义在包zii.widgets.jui中,包括CJuiAccordion , CJuiAutoComplete,CJuiDatePicker等.本篇介绍CJuiAccordion,显示一个Accordion组件(类似手风琴可以折叠的UI组件). 这个控件封装了 JUI Accordion插件. 基本用法如下: <?php $this->widget('zii.widgets.jui.CJuiAccordion', array( 'p

PHP开发框架Yii Framework教程(29) Zii组件-Menu示例

介绍完Yii数据库接口外,从本篇开始介绍Zii组件,包括列表视图ListView,表格视图GridView,此外还包括一些基于 JQuery的UI组件,如AutoComplete,DataPicker, Button, Drag 和 Drop等. 本文介绍Menu菜单用法,CMenu使用Html 列 表显示多级菜单,Menu配置通过其属性item来配置,每个菜单项包括三个主要属性 visible  是否可见 active 当前菜单项是否选中, items 子菜单项. 此外还包括如下属性: lab

PHP开发框架Yii Framework教程(46) Zii组件-Sortable示例

CJuiSortable显示一个列表,列表中的列表项可以通过拖放重新调整顺序,它封装了 JUI Sortable插件. 其基本用 法如下: <?php Yii::app()->clientScript->registerCss('sortable', " #sortable {list-style-type: none; margin: 0; padding: 0; width: 60%;} #sortable li {margin: 2px; padding: 4px; bo

PHP开发框架Yii Framework教程(45) Zii组件-Selectable示例

CJuiSelectable可以显示一个列表,列表的每个项支持Select事件,它封装了 JUI Selectable插件,其基本用法如下: <?php Yii::app()->clientScript->registerCss('selectable'," #selectable {list-style-type: none; margin: 0; padding: 0; width: 60%;} #selectable li {margin: 2px; padding: 4

PHP开发框架Yii Framework教程(44) Zii组件-Resizable示例

CJuiResizable可以使包含在其中的UI组件支持缩放功能,它封装了 JUI Resizable插件, CJuiResizable基本使用方 法如下: <?php $this->beginWidget('zii.widgets.jui.CJuiResizable', array( 'options'=>array( 'minWidth'=>50, 'minHeight'=>50, 'maxWidth'=>500, 'maxHeight'=>500, ), '

PHP开发框架Yii Framework教程(43) Zii组件-Droppable示例

上篇介绍如果使用UI组件支持拖放,CJuiDroppable表示某个区域可以接受拖拉过来的UI组件,它封装了 JUI Droppable插件 . 我们修改上例,添加一个Droppable区域,当有UI组件拖放到该区域时,显示"Dropped". <?php $this->beginWidget('zii.widgets.jui.CJuiDroppable', array( 'options'=>array( 'drop'=>'js:function(event,