yii添删改查实例(3)

提示: 通过AR使用多个数据库有两种方式。如果数据库的结构不同,你可以创建不同的AR基类实现不同的getDbConnection()。否则,动态改变静态变量CActiveRecord::db是一个好主意。

2、定义AR类

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

如下例子演示了代表tbl_post表的AR类的最简代码:

class Post extends CActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'tbl_post'; } }

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

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

默认情况下,AR类的名字和数据表的名字相同。如果不同,请覆盖tableName()方法。

要使用表前缀功能,AR类的 tableName() 方法可以通过如下方式覆盖

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

这就是说,我们将没有前缀的表名用双大括号括起来,这样Yii就能自动添加前缀,从而返回完整的表名。

数据表行中列的值可以作为相应AR实例的属性访问。例如,如下代码设置了 title 列 (属性):

$post=new Post; $post->title='a sample post';

虽然我们从未在Post类中显式定义属性title,我们还是可以通过上述代码访问。这是因为title是tbl_post表中的一个

列,CActiveRecord通过PHP的__get()魔术方法使其成为一个可访问的属性。如果我们尝试以同样的方式访问一个不存在的列,将会抛出一个异常。

如果一个表没有主键,则必须在相应的AR类中通过如下方式覆盖 primaryKey() 方法指定哪一列或哪几列作为主键。

public function primaryKey() { return 'id'; // 对于复合主键,要返回一个类似如下的数组 // return array('pk1', 'pk2'); }

3、创建记录

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

$post=new Post; $post->title='sample post'; $post->content='content for the sample post'; $post->create_time=time(); $post->save();

如果表的主键是自增的,在插入完成后,AR实例将包含一个更新的主键。在上面的例子中,id属性将反映出新插入帖子的主键值,即使我们从未显式地改变它。

如果一个列在表结构中使用了静态默认值(例如一个字符串,一个数字)定义。则AR实例中相应的属性将在此实例创建时自动含有此默认值。改变此默认值的一个方式就是在AR类中显示定义此属性:

class Post extends CActiveRecord { public $title='please enter a title'; ...... } $post=new Post; echo $post->title; // 这儿将显示: please enter a title

记录在保存(插入或更新)到数据库之前,其属性可以赋值为 CDbExpression 类型。例如,为保存一个由MySQL的 NOW() 函数返回的时间戳,我们可以使用如下代码:

$post=new Post; $post->create_time=new CDbExpression('NOW()'); //CDbExpression类就是计算数据库表达式的值 // $post->create_time='NOW()'; 不会起作用,因为 // 'NOW()' 将会被作为一个字符串处理。 $post->save();

提示: 由于AR允许我们无需写一大堆SQL语句就能执行数据库操作,我们经常会想知道AR在背后到底执行了什么SQL语句。这可以通过开启Yii的日志功能实现。例如,我们在应用配置中开启了CWebLogRoute,我们将会在每个网页的最后看到执行过的SQL语句。

我们也可以在应用配置中设置CDbConnection::enableParamLogging为true,这样绑定在SQL语句中的参数值也会被记录。

4、读取记录

要读取数据表中的数据,我们可以通过如下方式调用 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);

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

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