493333王中王开奖结果-王中王开奖一马中特

493333王中王开奖结果让不同类型的网络可以可靠地互相联接,王中王开奖一马中特拥有规模庞大的原创游戏,在这里您将享受的不一样快乐。

网络频道

当前位置:493333王中王开奖结果 > 网络频道 > 【王中王开奖一马中特】Yii AR(Active Record)数据库

【王中王开奖一马中特】Yii AR(Active Record)数据库

来源:http://www.soniaLorenzana.com 作者:493333王中王开奖结果 时间:2019-09-30 17:05

Active  Record(AR)是一种流行的对象关系映射(ORM)技术。每个AR类代表一个数据表(或视图),其字段作为AR类的属性,一个AR实例代表在表中的一行。常见的CRUD操作被作为AR类的方法执行。于是,我们可以使用更面向对象的方法处理我们的数据。例如,我们可以使用下面的代码在 tbl_post 表中插入一个新行:

CDbConnection: 一个抽象数据库连接
CDbCommand: SQL statement
CDbDataReader: 匹配结果集的一行记录
CDbTransaction:数据库事务

 代码如下

访问数据库前需要建立数据库连接;使用DAO建立一个抽象数据库链接:
$connection = new CDbConnection($dsn, $username, $password);
$connection->active = true;     // 只有激活了连接才可以使用
// 想要关闭连接,可以这样:
$connection->active = false;

$post=new Post;
$post->title='sample post';
$post->content='post body content';
$post->save();

CDbConnection继承自CApplicationComponent,所以他可以像组件一样在任何地方使用。因此可以这样访问:
Yii::app()->db 

在下面我们将介绍如何设置AR和用它来执行CRUD操作。在下一小节我们将展示如何使用AR 处理数据库中的关系。为了简单起见,我们使用本节下面的数据库表作为例子。 请注意,如果你使用MySQL数据库,在下面的SQL中您应该替换 AUTOINCREMENT 为 AUTO_INCREMENT 。

//执行SQL语句需要CDbCommand对象,而该对象由CdbConnection::createCommand()返回,因此:
$connection=Yii::app()->db;
$command=$connection->createCommand($sql);
// 如果SQL语句想要完全有自己写,可以这样:
$newSQL = '写下你令人惊讶的SQL语句';
$command->text=$newSQL;
// CDbCommand对象有两个方法execute()用于非查询SQL执行,而query(),通俗的讲就是用于SELECT查询
// execute()返回的是INSERT, UPDATE and DELETE操作受影响的记录行数
// query()返回一个CDbDataReader对象,使用CDbDataReader对象可以遍历匹配结果集中的所有记录。
$rowCount=$command->execute();  // execute the non-query SQL
$dataReader=$command->query();  // execute a query SQL // 返回CDbDataReader对像
$rows=$command->queryAll();     // query and return all rows of result
$row=$command->queryRow();      // query and return the first row of result
$column=$command->queryColumn();    // query and return the first column of result
$value=$command->queryScalar();     // query and return the first field in the first row

 代码如下

// query()返回的是代表结果集的对象而非直接的结果,因此要获取结果集的记录可以这样:
$dataReader=$command->query();
// CDbDataReader::read()可以一次获取一行数据,到末尾时返回false
while(($row=$dataReader->read())!==false)
// CDbDataReader实现了迭代器接口因此可以使用foreach遍历
foreach($dataReader as $row)
// 一次性返回所有的记录(数组)
$rows=$dataReader->readAll();

CREATE TABLE tbl_post (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(128) NOT NULL,
    content TEXT NOT NULL,
    create_time INTEGER NOT NULL
);

queryXXX() 形式的方法会直接返回匹配的记录集合,当query()不是,他返回一个代表结果集的对象

注意: AR不是要解决所有与数据库相关的任务。它最好用于在PHP结构中模型化数据表和执行不复杂的 SQL 语句. 而 Yii DAO 应该用于复杂的情况下。 建立数据库连接 AR需要一个数据库连接以执行数据库相关的操作。默认情况下,应用中的 db 组件提供了 CDbConnection实例作为我们需要的数据库连接。下面的应用程序配置提供了一个例子:

// YII中的CDbTransaction类用于事务
// 首先,建立一个连接
$connection = Yii::app()->db;
// 第二,开始事务
$transaction=$connection->beginTransaction();
// 第三,执行SQL,如果错误就抛出异常,在异常处理中回滚。
try
{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//.... other SQL executions
// 如果SQL执行都没有抛出异常,那就提交。
$transaction->commit();
} catch(Exception $e) {
    $transaction->rollBack();   // 在异常处理中回滚
}

 代码如下

// 执行SQL中,一般都需要绑定一些用户参数,对于用户参数,需要防止SQL注入攻击
// PDO对象的绑定参数的方法可以防止SQL注入攻击,同样扩展自PDO的DAO也有这样的功能
// 举例说明:
// 第一,建立一个连接:
$connection = Yii::app()->db;
// 第二,写下无敌的SQL语句,比如:
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
// 第三,创建CDbCommand对象用于执行SQL
$command=$connection->createCommand($sql);
// 接下来,将SQL语句中的形式参数,替换为实际参数
$command->bindParam(":username",$username,PDO::PARAM STR);   // 这与PDO有点不同,PDO中不带冒号
$command->bindParam(":email",$email,PDO::PARAM STR);    // 同样
// 最后,执行
$command->execute();
// 如果还有其他的数据需要插入,可以再次绑定实参。

return array(
    'components'=>array(
        'db'=>array(
            'class'=>'system.db.CDbConnection',
            'connectionString'=>'sqlite:path/to/dbfile',
            // turn on schema caching to improve performance
            // 'schemaCachingDuration'=>3600,
        ),
    ),
);

// 使用CDbDataReader对象的bindColumn()方法将结果集中的列绑定到PHP变量。
// 因此,读取一行记录,列值将自动填充到对应的PHP对象中
// 比如这样:
$connection = Yii::app()->db;
$sql = "SELECT username, email FROM tbl_user";
$dataReader = $connection->createCommand($sql)->query();    //很赞的方法链, 可惜不能接着.each()
$dataReader->bindColumn(1, $username);  //第一列值绑定到$username
$dataReader->bindColumn(2, $email);     //第二列值绑定到$email
//接着循环读取并操作数据
while( $dataReader->read() !== false ) {
    ... // 与先前的 while(($row=$dataReader->read())!==false) 有所不同哦!
}

提示: 由于Active Record需要表的元数据来确定数据表的字段信息,  这需要时间来读取和分析元数据。如果您的数据库结构是比较固定的,你应该打开缓存。  打开方法是配置CDbConnection::schemaCachingDuration属 性为一个大于0的值。 AR的支持受限于数据库管理系统。目前,只有以下数据库管理系统支持: MySQL 4.1 或以后版本 PostgreSQL 7.3 或以后版本 SQLite 2 和 3 Microsoft SQL Server 2000 或以后版本 Oracle 注意: Microsoft SQL Server自1.0.4版本提供支持;而对 Oracle 自1.0.5版本即提供支持。 如果你想使用其他组件而不是 db ,或者你使用 AR 访问多个数据库,你应该重写CActiveRecord::getDbConnection()。 CActiveRecord类 是所有AR类的基类。 提示: 有两种方法可以在AR模式下使用多种数据库系统。如果数据库的模式不同, 您可以以不同的getDbConnection()来 创建不同的 AR 类。否则,动态改变静态变量CActiveRecord::db 是一个更好的主意。 定义 AR 类 为了使用一个数据表,我们首先需要扩展CActiveRecord来 定义一个AR类。 每个AR类代表一个数据库表,每个AR实例代表数据表中的一行。下面的代码介绍了 要创建一个对应 tbl_post 表的AR类所需要的最少的代码。

// 设置表前缀,使用 CDbConnection::tablePrefix 属性在配置文件中设置
//

 代码如下

// Yii实现了把一条完整的SQL语句完完全全肢解的能力,比如这样:
$user = Yii::app()->db->createCommand();    // 哈,我喜欢的方法链!
        ->select('id, username, profile')
        ->from('tbl_user u')
        ->join('tbl_profile p', 'u.id=p.user_id')
        ->where('id=:id', array(':id'=>$id)
        ->queryRow();       // 返回匹配的结果集的第一行
// 其实这条语句可以这样写: $newSQL ='SELECT id, username, profile from tbl_user u INNER JOIN tbl_profile p ON u.id = p.user_id WHERE u.id =:id'
// 肢解法反倒让我感到厌烦了。。。。。。。。。

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

// yii提供了一种构建SQL的机制(也就是说不用自己写长长的SQL)
// 首相要实例化一个CDbCommand对象
$command = Yii::app()->db->createCommand();     // 注意参数留空了。。
// 可用的方法列表如下:
->select(): SELECT子句
->selectDistinct(): SELECT子句,并保持了记录的唯一性
->from():         构建FROM子句
->where():        构建WHERE子句
->join():         在FROM子句中构建INNER JOIN 子句
->leftJoin():     在FROM子句中构建左连接子句
->rightJoin():    在FROM子句中构建右连接子句
->crossJoin():    添加交叉查询片段(没用过)
->naturalJoin():  添加一个自然连接子片段
->group():        GROUP BY子句
->having():       类似于WHERE的子句,但要与GROUP BY连用
->order():        ORDER BY子句
->limit():        LIMIT子句的第一部分
->offset():       LIMIT子句的第二部分
王中王开奖一马中特,->union():        appends a UNION query fragment

提示: 因为AR类在很多地方被引用,我们可以导入包含AR类的整个目录,而不是逐个引入它们.例如,若我们所有的AR类文件位于 protected/models,我们可以如下配置:

select()默认返回全部列
// 但你可以这样:
select('username, email');
// 或使用表限定,或使用别名
select('tbl_user.id, username name');
// 或使用数组作为参数
select(array('id', 'count(*) as num'));

 代码如下

// 使用form() 如果制定了多个表需要使用逗号分隔的字符串,就像原生SQL语句那样:
from('tbl_user, tbl_post, tbl_profile');
// 当然,你也可以使用表别名, 还可以使用完整的数据库限定名
from('tbl_user u, public.tbl_profile p');

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

WHERE子句
// 在where()中使用 AND
where(array('and', 'id=:id', 'username=:username'), array(':id'=>$id, ':username'=>$username);
// 在where()中使用 OR 与 AND用法相同,如下:  ##看起来比直接写更加繁琐##
where( array('and', 'type=1', array('or', 'id=:id','username=:username') ),array(':id'=>$id, ':username'=>$username ));
// IN 操作符用法
where(array('in', 'id', array(1,2,3)))
// LIKE 用法
where( array('like', 'name', '%tester%') );
where( array('like','name', array('%test%', '%sample%')) ) // 等于 name LIKE '%test%' AND name LIKE '%sample%
    // 再这样复杂下去, 使用这种方法简直是自杀行为。

默认的, AR 类的名字和数据表的名字相同. 若它们不同需要重写 tableName() 方法. 方法 model() is declared as such for every AR class (to be explained shortly). 信息: 要使用版本 1.1.0 引入的表前缀特征, AR 的方法 tableName() 可以被如下重写,

$keyword=$ GET['q'];
// escape % and characters
$keyword=strtr($keyword, array('%'=>'n%', ' '=>'n '));
$command->where(array('like', 'title', '%'.$keyword.'%'));

 代码如下

// 添加了这么多,你都不知道合成后的SQL长啥样了,可以使用->text查看(魔术方法)
// 如果觉得组合的SQL没有错误,那就执行他,添加->queryAll(); 这可以获得所有匹配的结果集。
// 当然,如果你确定执行的结果集中只有一行,可以添加->queryRow();来直接获取。
// 如果一个CDbCommand对象需要执行多次,那么在下一次执行之前记得调用reset();
$command = Yii::app()->db->createCommand();
$users = $command->select('*')->from('tbl_users')->queryAll();
$command->reset(); // clean up the previous query
$posts = $command->select('*')->from('tbl_posts')->queryAll();

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

/// YII的SQL构建函数就是一鸡肋。

这样,不是返回一个完整的表名, 我们返回去掉了前缀的表名,并把它环绕在双弯曲括号中. 一条数据的字段可以作为相应 AR 实例的属性被访问. 例如, 下面的代码设置了 title 字段(属性):

// Active Record
// 使用AR以面向对象的方式访问数据库,AR实现了ORM技术
// 当Post类表示表tbl_post时,我们可以使用这样的方式插入一条数据
$post = new Post();
$post->title = 'new title';
$post->content = 'new content';
$post->save();      // 保存即插入

 代码如下

// AR最典型的功能就是执行CRUD操作
// DAO定位于解决复杂的数据库查询,而AR定位于解决简单的数据库查询
// 一个AR类代表一张数据表,而一个AR对象代表表中的一行真实的记录,AR类继承CActiveRecord。
// 如果有一张POST表`tbl_post`,你可以这样定义一个AR类
class Post extends CACtiveRecord
{
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

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

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

虽然我们没有在 Post 类中明确声明 title 属性, 我们仍然可以在上面的代码中访问它. 这是因为 title 是表 tbl_post 中的字段, 在 PHP __get() 魔术方法的帮助下,CActiveRecord 可以将其作为一个属性来访问. 若以同样方式尝试访问不存在的字段,一个异常将被抛出. 信息:在此指南中,我们为所有的数据表和字段采取小写格式.这是因为在不同的DBMS中,对 于大小写的敏感是不 同的.例如,PostgreSQL默认对字段名字是大小写不敏感的, and we must quote a column in  a query condition if the column contains mixed-case  letters.使用小写格式可以避免此问题. AR 依赖于数据表良好定义的主键. 若一个表没有一个主键, 需要相应的 AR 类指定哪些字段应当为主键,通过重写 primaryKey() 方法,

// 表中的每一个字段都由AR类中的一个属性表示,如果试图通过属性访问表中没有字段,将会抛出一个异常。

 代码如下

// 一个AR一定需要一个主键,如果某张表没有主键,你就自己在类中伪造一个,像这样:
public function primaryKey()
{
    return 'id';        // 'id' 是关联表中的一个字段,但他不是主键,现在将它指定为主键
}

public function primaryKey()
{
    return ’id’;
    // For composite primary key, return an array like the following
    // return array(’pk1’, ’pk2’);
}

// 实例化一个AR,填写信息(类似于填充用户提交的信息),然后保存
$post = new Post;
$post->title = 'sample post';
$post->content = 'content for the sample post';
$post->create_time = time();
$post->save();  // 保存/插入

创建记录 要插入新的一行记录到数据表中, 我们创建一个新的对应的 AR 类实例, 设置和字段对应的属性的值, 并调用 save() 方法来完成插入.

// 通过AR读取记录 fine() findByPk() findByAttributes() findBySql()
$post=Post::model()->find($condition,$params);                  // 返回Post对象(如果有匹配记录的话), 否则返回NULL
$post=Post::model()->findByPk($postID,$condition,$params);
$post=Post::model()->findByAttributes($attributes,$condition,$params);
$post=Post::model()->findBySql($sql,$params);

 代码如下

// find()的一个例子:
$post=Post::model()->find('postID=:postID', array(':postID'=>10));
// 如果查询条件很是复杂,就要使用CDbCriteria类
$criteria = new CDbCriteria;
$criteria->select='title';
$creteria->condition='postID=:postID';
$criteria->params=array(':postID'=>10);
$post=Post::model()->find($criteria);   // 不需要第二个参数
// 另一种更好的写法
$post=Post::model()->find(array(
        'select' => 'title',
        'condition' => 'postID=:postID',
        'params' => array(':postID' => 10)
        ));

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

// 如果查找的是多行记录可以使用 findAll() findAllByPk() findAllByAttributes() findAllBySql()
// find all rows satisfying the specified condition
$posts=Post::model()->findAll($condition,$params);
// find all rows with the specified primary keys
$posts=Post::model()->findAllByPk($postIDs,$condition,$params);
// find all rows with the specified attribute values
$posts=Post::model()->findAllByAttributes($attributes,$condition,$params);
// find all rows using the specified SQL statement
$posts=Post::model()->findAllBySql($sql,$params);
// 如果没有匹配的行,将返回一个空数组,这可以用empty()去检测

若表的主键是自增的, 在插入后 AR 实例将包含一个更新后的主键. 在上面的例子中, 属性id 将映射为新插入的主键值, 即使我们没有明确更改它.

// 另外的一些可以使用的方法:
// get the number of rows satisfying the specified condition
$n=Post::model()->count($condition,$params);
// get the number of rows using the specified SQL statement
$n=Post::model()->countBySql($sql,$params);
// check if there is at least a row satisfying the specified condition
$exists=Post::model()->exists($condition,$params);

若在表模式中,一个字段被定义为一些静态默认值(static default value) (例如一个字符串, 一个数字), 在这个AR实例被创建后, 实例中相应的属性将自动有相应的默认值. 改变此默认值的一个方式是在 AR 类中明确声明此属性:

// 使用AR更新记录
// 一个典型的实例:
$post=Post::model()->findByPk(10);
$post->title='new post title';
$post->save(); // save the change to database
// 怎么知道这是一条新纪录还是一条旧的记录呢?使用如下方法:
if( CActiveRecord::isNewRecord )
// update the rows matching the specified condition
Post::model()->updateAll($attributes,$condition,$params);
// update the rows matching the specified condition and primary key(s)
Post::model()->updateByPk($pk,$attributes,$condition,$params);
// update counter columns in the rows satisfying the specified conditions
Post::model()->updateCounters($counters,$condition,$params);

 代码如下

// 删除记录
$post=Post::model()->findByPk(10); // assuming there is a post whose ID is 10
$post->delete(); // delete the row from the database table
// 注意,当删除记录之后,$post仍然可用, 且保留了原始数据。
// 类级别的方法
// delete the rows matching the specified condition
Post::model()->deleteAll($condition,$params);
// delete the rows matching the specified condition and primary key(s)
Post::model()->deleteByPk($pk,$condition,$params);

class Post extends CActiveRecord
{
    public $title=’please enter a title’;
    ......
}
$post=new Post;
echo $post->title;  // this would display: please enter a title

// 数据验证
// 将用户提交的数据保存到AR对象中
$post->title = $_POST['title'];
$post->content = $_POST['content'];
$post->save();

从版本 1.0.2 开始, 在记录被保存前(插入或更新)一个属性可以赋值为 CDbExpression 类型的值. 例如, 为了保存由 MySQL NOW() 函数返回的时间戳, 我们可以使用下面的代码:

// assume $ POST['Post'] is an array of column values indexed by column names
$post->attributes=$ POST['Post'];
$post->save();

 代码如下

// RAR:Relatived Actie Record
// RAR本质上就是执行关系数据查询

$post=new Post;
$post->create time=new CDbExpression(’NOW()’);
// $post->create time=’NOW()’; will not work because
// ’NOW()’ will be treated as a string
$post->save();

// 如何让一个AR关联另一个AR
// 4中关系类型
self::BELONGS_TO
self::HAS_MANY
self::HAS_ONE
self::MANY_MANY

提示:AR 允许我们执行数据库操作而无需编写麻烦的 SQL 语句, 我们常常想要知道什么 SQL 语句被 AR 在下面执行了. 这可以通过打开 Yii 的记录(logging)特征来实现. 例如, 我们可以在应用配置中打开 CWebLogRoute , 我们将看到被执行的 SQL 语句被显示在每个页面的底部. 自版本 1.0.5 开始, 我们可以在应用配置设置 CDbConnection::enableParamLogging 为 true 以便 绑定到 SQL 语句的参数值也被记录. 读取记录 要读取数据表中的数据,我们可以调用下面其中一个 find 方法:

关系名称(关系类型,要关联的类名,外键名,其他额外的选项);
// 定义表关系 类:Post
public function relations()
{
    return array(
        'author'=>array(self::BELONGS_TO, 'User', 'author_id'),     // 返回User对象
        'categories'=>array(self::MANY_MANY, 'Category', 'tbl_post_category(post_id, category_id)'),
    );
}
// 类:User
public function relations()
{
    return array(
            'posts' => array(self::HAS_MANY, 'Post', 'author_id'),
            'profile' => array(self::HAS_ONE, 'Profile', 'owner_id')
    );
}

 代码如下

// 定义了AR间的关系之后,当执行关系查询时,与AR关联的AR也会自动实例化, 比如这样:
$author = User::model()->findByPk(1);
$author->posts;         // posts关系已经定义。

// find the first row satisfying the specified condition
$post=Post::model()->find($condition,$params);
// find the row with the specified primary key
$post=Post::model()->findByPk($postID,$condition,$params);
// find the row with the specified attribute values
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// find the first row using the specified SQL statement
$post=Post::model()->findBySql($sql,$params);

// 执行关系查询
1).lazy loading approach 懒惰关系执行
// retrieve the post whose ID is 10
$post=Post::model()->findByPk(10);
// retrieve the post's author: a relational query will be performed here
$author=$post->author;  // 如果先前没有执行过,现在才执行这个关系查询(事情拖到这一步才做,真的是很懒啊!)

在上面, 我们使用 Post::model() 调用 find 方法. 记得静态方法 model() 是每个 AR 类所必需的. 此方法返回一个 AR 实例,此实例 被用来访问类水平的方法(类似于静态的类方法).

// 如果关系查询执行后没有匹配的结果,返回将会是NULL或空的数组。

若 find 方法找到一行记录满足查询条件, 它将返回一个 Post 实例,此实例的属性包含表记录对应的字段值. 然后我们可以读取被载入的值如同我们访问普通对象的属性, 例如, echo $post->title; . find 方法将返回 null 若在数据库中没有找到满足条件的记录.

2).eager loading approach   热心的关系查询 //这名字真的很萌!
// 也就是说一次性取回所有你想要的记录。管你要不要,这这这,太热心了吧!
$posts=Post::model()->with('author')->findAll();
// SQL => 'SELECT tbl_post.*, author.* FROM tbl_post t INNER JOIN tbl_user author ON t.author = tbl_user.id'

当调用 find ,我们使用 $condition 和 $params 来指定查询条件. 这里 $condition 可以是字符串代表一个 SQL 语句中的 WHERE 子语句, $params 是一个参数数组,其中的值应被绑定到 $condition 的占位符.例如,

$posts=Post::model()->with('author','categories')->findAll();
// SQL => 'SELECT * FROM tbl_post t INNER JOIN tbl_user u ON t.author = u.id INNER JOIN categories c ON t.id = c.post_id'

 代码如下

$posts=Post::model()->with(
    'author.profile',
    'author.posts',
    'categories')->findAll();

// find the row with postID=10
$post=Post::model()->find(’postID=:postID’, array(’:postID’=>10));

$criteria=new CDbCriteria;
$criteria->with=array(
'author.profile',
'author.posts',
'categories',
);
$posts=Post::model()->findAll($criteria);
或者
$posts=Post::model()->findAll(array(
                                    'with'=>array(
                                    'author.profile',
                                    'author.posts',
                                    'categories',
                                    )
                             );

注意: 在上面的例子中, 对于某些 DBMS 我们可能需要转义对 postID 字段的引用. 例如, 若我们使用 PostgreSQL, 我们需要写condition 为“postID”=:postID ,因为 PostgreSQL 默认情况下对待字段名字为大小写不敏感的. 我们也可以使用 $condition 来指定更复杂的查询条件. 不使用字符串,我们让 $condition 为一个 CDbCriteria 实例,可以让我们指定条件而不限于 WHERE 子语句。例如,

// 如果我们想知道用户中谁发过帖子,并且帖子的状态是“公开”。我们并不关心用户发表过的帖子的内容。
$user = User::model()->with('posts')->findAll();
                'VS'
$user = User::model()->with(array(
                                    'posts' => array(
                                                        'select' => false,
                                                        'joinType' => 'INNER JOIN',
                                                        'condition' => 'posts.published = 1'
                                                    ),
                                 )
                           )->findAll();
// 返回的将会是所有发过帖子(且帖子已经公开)的用户

 代码如下

// 在relatinos()中定义更加复杂的关系
class User extends CActiveRecord
{
    public function relations()
    {
            return array(
                    'posts'=>array(self::HAS MANY, 'Post', 'author id',
                    'order'=>'posts.create time DESC',
                    'with'=>'categories'),
                    'profile'=>array(self::HAS ONE, 'Profile', 'owner id'),
                    );
    }
}

$criteria=new CDbCriteria;
$criteria->select=’title’; // only select the ’title’ column
$criteria->condition=’postID=:postID’;
$criteria->params=array(’:postID’=>10);
$post=Post::model()->find($criteria); // $params is not needed

// 利用别名解决歧义
$posts=Post::model()->with('comments')->findAll(array(
        'order'=>'t.create time, comments.create time'
    ));
                       
// Dynamic Relational Query 动态关系SQL查询,更改默认插叙条件:
User::model()->with(array(
        'posts'=>array('order'=>'posts.create time ASC'),
        'profile',
    ))->findAll();

注意, 当使用 CDbCriteria 作为查询条件, 不再需要参数 $params 因为它可以在 CDbCriteria 中被指定, 如上所示.

$user=User::model()->findByPk(1);
$posts=$user->posts(array('condition'=>'status=1'));        // 返回的都是AR对象, 而不是数据

一个可选的 CDbCriteria 方式是传递一个数组到 find 方法. 数组的键和值分别对应于 criteria 的属性名字和值.上面的例子可以被如下重写,

// 统计查询
class Post extends CActiveRecord
{
    public function relations()
    {
        return array(
            'commentCount'=>array(self::STAT, 'Comment', 'post_id'),
            'categoryCount'=>array(self::STAT, 'Category', 'post_category(post_id, category_id)'),
        );
    }
}

 代码如下

$post=Post::model()->find(array(
    ’select’=>’title’,
    ’condition’=>’postID=:postID’,
    ’params’=>array(’:postID’=>10),
));

信息: 当一个查询条件是关于匹配一些字段用指定的值, 我们可以使用 findByAttributes()。 我们让参数 $attributes 为一个数组,数组的值由字段名字索引. 在一些框架中,此任务可以通过调用类似于 findByNameAndTitle 的方法来实现. 虽然这个方法看起来很有吸引力, 但它常常引起混淆和冲突,例如字段名字的大小写敏感性问题. 当多行记录满足指定的查询条件, 我们可以使用下面的 findAll 方法将它们聚合在一起, 每个都有它们自己的副本 find 方法。

 代码如下

// find all rows satisfying the specified condition
$posts=Post::model()->findAll($condition,$params);
// find all rows with the specified primary keys
$posts=Post::model()->findAllByPk($postIDs,$condition,$params);
// find all rows with the specified attribute values
$posts=Post::model()->findAllByAttributes($attributes,$condition,$params);
// find all rows using the specified SQL statement
$posts=Post::model()->findAllBySql($sql,$params);

若没有符合条件的记录, findAll 返回一个空数组. 不同于 find 方法,find方法会返回 null.

除了上面所说的 find 和 findAll 方法, 为了方便, 下面的方法也可以使用:

本文由493333王中王开奖结果发布于网络频道,转载请注明出处:【王中王开奖一马中特】Yii AR(Active Record)数据库

关键词:

上一篇:没有了

下一篇:没有了