yii添删改查实例(5)

在上面的代码中, $attributes 是一个含有以 列名作索引的列值的数组; $counters 是一个由列名索引的可增加的值的数组;$condition 和 $params 在前面的段落中已有描述。

6、删除记录

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

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

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

使用下面的类级别代码,可以无需首先加载行就可以删除它。

// 删除符合指定条件的行 Post::model()->deleteAll($condition,$params); // 删除符合指定条件和主键的行 Post::model()->deleteByPk($pk,$condition,$params);

7、数据验证

当插入或更新一行时,我们常常需要检查列的值是否符合相应的规则。如果列的值是由最终用户提供的,这一点就更加重要。总体来说,我们永远不能相信任何来自客户端的数据。

当调用 save() 时, AR 会自动执行数据验证。验证是基于在 AR 类的 rules() 方法中指定的规则进行的。关于验证规则的更多详情,请参考 声明验证规则 一节。下面是保存记录时所需的典型的工作流。

if($post->save()) { // 数据有效且成功插入/更新 } else { // 数据无效,调用 getErrors() 提取错误信息 }

当要插入或更新的数据由最终用户在一个 HTML 表单中提交时,我们需要将其赋给相应的 AR 属性。我们可以通过类似如下的方式实现:

$post->title=$_POST['title']; $post->content=$_POST['content']; $post->save();

如果有很多列,我们可以看到一个用于这种复制的很长的列表。这可以通过使用如下所示的 attributes 属性简化操作。更多信息可以在 安全的特性赋值 一节和 创建动作 一节找到。

// 假设 $_POST['Post'] 是一个以列名索引列值为值的数组 $post->attributes=$_POST['Post']; $post->save();

8、对比记录

类似于表记录,AR实例由其主键值来识别。因此,要对比两个AR实例,假设它们属于相同的AR类, 我们只需要对比它们的主键值。然而,一个更简单的方式是调用 CActiveRecord::equals()。

不同于AR在其他框架的执行, Yii在其 AR 中支持多个主键. 一个复合主键由两个或更多字段构成。相应地,主键值在Yii中表现为一个数组。primaryKey属性给出了一个 AR 实例的主键值。

9、自定义

CActiveRecord  提供了几个占位符方法,它们可以在子类中被覆盖以自定义其工作流。

beforeva lidate 和 afterValidate:这两个将在验证数据有效性之前和之后被调用。

beforeSave 和 afterSave: 这两个将在保存 AR 实例之前和之后被调用。

beforeDelete 和 afterDelete: 这两个将在一个 AR 实例被删除之前和之后被调用。

afterConstruct: 这个将在每个使用 new 操作符创建 AR 实例后被调用。

beforeFind: 这个将在一个 AR 查找器被用于执行查询(例如 find(), findAll())之前被调用。

afterFind: 这个将在每个 AR 实例作为一个查询结果创建时被调用。

10、使用AR处理事务

每个 AR 实例都含有一个属性名叫 dbConnection  ,是一个 CDbConnection 的实例,这样我们可以在需要时配合 AR 使用由 Yii DAO 提供的 事务 功能:

$model=Post::model(); $transaction=$model->dbConnection->beginTransaction(); try { // 查找和保存是可能由另一个请求干预的两个步骤 // 这样我们使用一个事务以确保其一致性和完整性 $post=$model->findByPk(10); $post->title='new post title'; $post->save(); $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); }

11、命名范围

命名范围(named scope)表示一个命名的(named)查询规则,它可以和其他命名范围联合使用并应用于Active Record查询。

命名范围主要是在 CActiveRecord::scopes() 方法中以名字-规则对的方式声明。如下代码在Post模型类中声明了两个命名范围, published 和 recently。

class Post extends CActiveRecord { ...... public function scopes() { return array( 'published'=>array( 'condition'=>'status=1', ), 'recently'=>array( 'order'=>'create_time DESC', 'limit'=>5, ), ); } }

每个命名范围声明为一个可用于初始化 CDbCriteria 实例的数组。例如,recently 命名范围指定 order 属性为 create_time DESC , limit 属性为 5。他们翻译为查询规则后就会返回最近的5篇帖子。

命名范围多用作 find 方法调用的修改器。几个命名范围可以链到一起形成一个更有约束性的查询结果集。例如,要找到最近发布的帖子,我们可以使用如下代码:

$posts=Post::model()->published()->recently()->findAll();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/bf9280780cbdcd28ce43da082ea5f146.html