yii快速入门教程10

来源:互联网 发布:双立人去味皂淘宝 编辑:程序博客网 时间:2024/04/28 21:49
7、使用表前缀
要使用表前缀,配置 CDbConnection::tablePrefix  属性为所希望的表前缀。然后,在 SQL 语句中使用 {{TableName}} 代表表的名字,其中的 TableName  是指不带前缀的表名。例如,如果数据库含有一个名为 tbl_user 的表,而 tbl_ 被配置为表前缀,那我们就可以使用如下代码执行用户相关的查询:
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();

二、Active Record
虽然Yii DAO可以处理几乎任何数据库相关的任务,但很可能我们会花费 90% 的时间以编写一些执行普通 CRUD(create, read, update 和 delete)操作的SQL语句。而且我们的代码中混杂了SQL语句时也会变得难以维护。要解决这些问题,我们可以使用Active Record。
Active Record(AR)是一个流行的对象-关系映射(ORM)技术。每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个AR实例则表示表中的一行。常见的 CRUD 操作作为 AR 的方法实现。因此,我们可以以一种更加面向对象的方式访问数据。例如,我们可以使用以下代码向tbl_post表中插入一个新行。
$post=new Post;
$post->title='sample post';
$post->content='post body content';
$post->save();
注意: AR并非要解决所有数据库相关的任务。它的最佳应用是模型化数据表为PHP结构和执行不包含复杂SQL语句的查询。 对于复杂查询的场景,应使用Yii DAO。
1、建立数据库连接
AR依靠一个数据库连接以执行数据库相关的操作。默认情况下,它假定db应用组件提供了所需的CDbConnection数据库连接实例。如下应用配置提供了一个例子:
return array(
    'components'=>array(
        'db'=>array(
            'class'=>'system.db.CDbConnection',
            'connectionString'=>'sqlite:path/to/dbfile',
            // 开启表结构缓存(schema caching)提高性能
            // 'schemaCachingDuration'=>3600,
        ),
    ),
);
提示: 由于Active Record依靠表的元数据(metadata)测定列的信息,读取元数据并解析需要时间。 如果你数据库的表结构很少改动,你应该通过配置CDbConnection::schemaCachingDuration属性的值为一个大于零的值开启 表结构缓存。
如果你想使用一个不是db的应用组件,或者如果你想使用AR处理多个数据库,你应该覆盖CActiveRecord::getDbConnection()。CActiveRecord类是所有AR类的基类。
提示: 通过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_r('NOW()'); //CDbExpression类就是计算数据库表达式的值
// $post->create_time='NOW()'; 不会起作用,因为
// 'NOW()' 将会被作为一个字符串处理。
$post->save();
提示: 由于AR允许我们无需写一大堆SQL语句就能执行数据库操作, 我们经常会想知道AR在背后到底执行了什么SQL语句。这可以通过开启Yii的日志功 能实现。例如,我们在应用配置中开启了CWebLogRoute,我们将会在每个网页的最后看到执行过的SQL语句。 我们也可以在应用配置中设置CDbConnection::enableParamLogging为true,这样绑定在SQL语句中的参数值也会被记录。

原文来自:http://www.yiichina.org/forum/thread-892-1-2.html
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电视接收网络信号不好怎么办 tcl电视待机打不开怎么办 宽带电视看不了怎么办 电视总是闪退怎么办 电视出现系统更新怎么办 电视一直在更新怎么办 电视更新死机了怎么办 法院打电话不接怎么办 内向不敢辞职怎么办呀 生气后睡不着觉怎么办 被气得睡不着怎么办 一生气就睡不着怎么办 手机接电话声音小怎么办 发微信老公不回怎么办 欠钱没有欠条怎么办 朋友欠钱不还怎么办没欠条 个人欠销售货款怎么办 货款一直不还怎么办 欠钱不接电话找不到人怎么办 欠钱人电话不接怎么办 客户欠款不给怎么办 客户货款打一半怎么办 欠款人不到庭怎么办 别人打电话不接怎么办 百合注册被禁用怎么办? 监控显示未登录怎么办 发票认证了两次怎么办 拼多多账号异常怎么办 淘新闻账号异常怎么办 白领贷逾期了怎么办 用钱包信用不足怎么办 易借金app闪退怎么办 随心借不还款怎么办 苹果x来电显示慢怎么办 被垃圾短信轰炸怎么办 苹果手机被轰炸怎么办 苹果被短信轰炸怎么办 苹果电脑开不开机怎么办 苹果8plus黑屏怎么办 iphone7开不了机怎么办 苹果7自动黑屏怎么办