当前位置: 澳门新濠3559 > 编程 > 正文

匹配结果集的一行记录,数据访问对象 (DAO)【澳

时间:2019-12-08 22:39来源:编程
匹配结果集的一行记录,数据访问对象 (DAO)【澳门新濠3559】。$column=$command-queryColumn(卡塔尔国; // 查询并重返结果中的第一列 // 使用form()要是制订了七个表须要运用逗号分隔的字符串,

匹配结果集的一行记录,数据访问对象 (DAO)【澳门新濠3559】。$column=$command->queryColumn(卡塔尔国; // 查询并重返结果中的第一列

// 使用form()要是制订了七个表须要运用逗号分隔的字符串,就好像原生SQL语句那样:
from('tbl_user, tbl_post, tbl_profile');
// 当然,你也足以行使表外号, 还足以行使完整的数目库限制名
from('tbl_user u, public.tbl_profile p');

{
$transaction->rollBack();
}

// 如果找寻的是多行记录能够选拔 findAll(卡塔尔(英语:State of Qatar) findAllByPk()findAllByAttributes(卡塔尔(英语:State of Qatar) findAllBySql(卡塔尔(قطر‎
// find all rows satisfying the specified condition
$posts=Post::model()->findAll($condition,$params);
// find all rows with the specified primary keys
澳门新濠3559,$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(卡塔尔国去检验

$connection=Yii::app(卡塔尔(قطر‎->db; // 要是你早已创立了贰个 "db" 连接 // 若无,你恐怕需求显式创立叁个老是:

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

$data里德r=$command->query(卡塔尔; // 实施八个SQL查询

// 施行关系查询
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;  // 假使原先未曾施行过,以后才施行这些涉及查询(事情拖到这一步才做,真的是很懒啊!卡塔尔

$command=$connection->createCommand($sql卡塔尔(قطر‎; // 假如供给,此 SQL 语句可由此如下方式更正:

波及名称(关系项目,要涉及的类名,外键名,别的额外的挑选卡塔尔(英语:State of Qatar);
// 定义表关系 类: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')
    );
}

一条 SQL 语句会通过 CDbCommand 以如下三种方法被奉行:
execute(卡塔尔(英语:State of Qatar): 试行叁个无查询 (non-query)SQL语句,举个例子 INSERT, UPDATE 和 DELETE 。要是成功,它将回到此推行所影响的行数。
query(卡塔尔(قطر‎: 实施一条会回去若干行数据的 SQL 语句,举例SELECT。借使成功,它将再次回到一个 CDbDataReader 实例,通过此实例能够遍历数据的结果行。为方便起见,(Yii)还达成了大器晚成雨后冬笋queryXXX(卡塔尔(英语:State of Qatar) 方法以直接再次回到查询结果。
实行 SQL 语句时豆蔻年华旦爆发错误,将会抛出多少个格外。

$user=User::model()->findByPk(1);
$posts=$user->posts(array('condition'=>'status=1'卡塔尔卡塔尔国;        // 重返的都以A讴歌MDX对象, 并不是数码

办法 bindParam(卡塔尔国 和 bindValue(卡塔尔极度相像。唯生机勃勃的区分就是前面三个接纳三个PHP变量绑定参数,而后人使用一个值。对于那个内部存款和储蓄器中的大数据块参数,处于质量的伪造,应先行使用前边一个。
6、绑定列

// yii提供了后生可畏种塑造SQL的编写制定(也正是说不用本人写长长的SQL)
// 首相要实例化二个CDbCommand对象
$command = Yii::app(卡塔尔(英语:State of Qatar)->db->createCommand(卡塔尔(قطر‎;     // 注意参数留空了。。
// 可用的主意列表如下:
->select(): SELECT子句
->selectDistinct(卡塔尔(قطر‎: SELECT子句,并维持了记录的唯豆蔻年华性
->from():         构建FROM子句
->where():        构建WHERE子句
->join(卡塔尔:         在FROM子句中塑造INNE昂Cora JOIN 子句
->leftJoin(卡塔尔国:     在FROM子句中创设左连接子句
->rightJoin(卡塔尔国:    在FROM子句中创设右连接子句
->crossJoin(卡塔尔:    增加交叉查询部分(没用过卡塔尔
->naturalJoin(卡塔尔(英语:State of Qatar):  增多三个本来连接子片段
->group():        GROUP BY子句
->having():       类似于WHERE的子句,但要与GROUP BY连用
->order():        ORDER BY子句
->limit(卡塔尔国:        LIMIT子句的首先某些
->offset(卡塔尔(قطر‎:       LIMIT子句的第二部分
->union():        appends a UNION query fragment

Yii提供了刚劲的数据库编程帮忙。Yii数据访问对象(DAO卡塔尔构建在PHP的多少对象(PDO卡塔尔国extension上,使得在二个单意气风发的合併的接口能够访谈分化的数据库处理系列(DBMS卡塔尔国。使用Yii的DAO开采的应用程序能够十分轻便地切换使用分裂的数据库管理连串,而不须求改革数据访谈代码。Yii 的Active Record( ACR-V),完毕了被布满使用的指标关系映射(ORM卡塔尔办法,进一层简化数据库编制程序。根据预定,一个类代表一个表,叁个实例代表大器晚成行数据。Yii A兰德酷路泽息灭了抢先1/4用以拍卖CRUD(创立,读取,更新和删除)数据操作的sql语句的双重任务。
固然Yii的DAO和AR能够管理大致具备数据库相关的任务,您还是可以够在Yii application中运用本人的数据库。事实上,Yii框架专心设计使得能够与此外第三方库同期采纳。
多少访谈对象 (DAO卡塔尔(قطر‎

$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'

)

// 通过ATiguan读取记录 fine(卡塔尔(英语:State of Qatar) findByPk(卡塔尔(英语:State of Qatar) findByAttributes(卡塔尔国 findBySql(卡塔尔国
$post=Post::model(卡塔尔(英语:State of Qatar)->find($condition,$params卡塔尔(英语:State of Qatar);                  // 再次来到Post对象(如若有极度记录的话), 不然赶回NULL
$post=Post::model()->findByPk($postID,$condition,$params);
$post=Post::model()->findByAttributes($attributes,$condition,$params);
$post=Post::model()->findBySql($sql,$params);

$rowCount=$command->execute(卡塔尔(英语:State of Qatar); // 实践无查询SQL

// 数据声明
// 将客户提交的多太师存到A奥德赛对象中
$post->title = $_POST['title'];
$post->content = $_POST['content'];
$post->save();

 // $command->text=$newSQL;

// 定义了A传祺间的涉嫌之后,当实施关系查询时,与A智跑关联的AENVISION也会活动实例化, 譬喻那样:
$author = User::model()->findByPk(1);
$author->posts;         // posts关系已经定义。

$transaction=$connection->beginTransaction();

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'

foreach($dataReader as $row卡塔尔国 { ... } // 三次性领取全体行到七个数组

// 使用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卡塔尔(英语:State of Qatar)有所区别哦!
}

try {
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute(); //.... other SQL executions
$transaction->commit();

select(卡塔尔国暗许重返全部列
// 但您能够如此:
select('username, email');
// 或行使表约束,或接收别名
select('tbl_user.id, username name');
// 或应用数组作为参数
select(array('id', 'count(*) as num'));

当得到查询结果时,你也足以选用PHP变量绑定列。那样在每一回得到查询结果中的后生可畏行时就能够活动使用新型的值填充。

// A途胜最冠绝一时的功能便是举办CRUD操作
// DAO定坐落于消亡复杂的数据库查询,而A奥迪Q5定坐落于消除轻松的数据库查询
// 贰个A大切诺基类代表一张数据表,而四个A讴歌MDX对象表示表中的风度翩翩行真实的记录,A奇骏类世襲CActiveRecord。
// 假设有一张POST表`tbl_post`,你能够如此定义叁个APRADO类
class Post extends CACtiveRecord
{
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

5、绑定参数

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

注意: 不一样于query(卡塔尔, 全体的queryXXX(卡塔尔方法会直接再次回到数据。举例,queryRow(卡塔尔(英语:State of Qatar)会回到代表询问结果第少年老成行的叁个数组。
4、使用工作

// 删除记录
$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);

业务,在 Yii 中表现为 CDbTransaction  实例,大概会在底下的图景中运转:
    * 初步事务.
    * 多少个个推行查询。任何对数据库的翻新对外面不可以看到。
    * 提交业务。假设事情成功,更新成为可以预知。
    * 如若查询中的一个受挫,整个事情回滚。
上述职业流能够通过如下代码完结:

// 怎么着让多个ASportage关联另多个ATiggo
// 4中涉嫌项目
self::BELONGS_TO
self::HAS_MANY
self::HAS_ONE
self::MANY_MANY

'class'=>'CDbConnection',

// 在relatinos(卡塔尔(英语:State of Qatar)中定义尤其积重难返的关联
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'),
                    );
    }
}

    * SQLite: sqlite:/path/to/dbfile
    * MySQL: mysql:host=localhost;dbname=testdb
    * PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
    * SQL Server: mssql:host=localhost;dbname=testdb
    * Oracle: oci:dbname=//localhost:1521/testdb

/// YII的SQL创设函数正是生机勃勃鸡肋。

数据库连接创立后,SQL 语句就能够经过行使 CDbCommand  试行了。你能够透过动用内定的SQL语句作为参数调用 CDbConnection::createCommand(卡塔尔 成立一个 CDbCommand 实例。

// 推行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 STENVISION卡塔尔国;   // 那与PDO有一点分裂,PDO中不带冒号
$command->bindParam(":email",$email,PDO::PARAM STR);    // 同样
// 最后,执行
$command->execute();
// 就算还也有其余的数额须求插入,能够重新绑定实参。

 ...... 'db'=>array(

CDbConnection: 三个大而无当数据库连接
CDbCommand: SQL statement
CDbDataReader: 相配结果集的后生可畏行记录
CDbTransaction:数据库事务

$rows=$command->queryAll(卡塔尔(قطر‎; // 查询并回到结果中的全数行

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

),

// 叁个A奔驰M级一定必要多个主键,要是某张表未有主键,你就和煦在类中杜撰三个,像这么:
public function primaryKey()
{
    return 'id';        // 'id' 是关联表中的三个字段,但他不是主键,今后将它钦赐为主键
}

$connection->active=false; // 关闭连接

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

Yii DAO 基于 PHP Data Objects (PDO卡塔尔(英语:State of Qatar)构建。它是一个为无数风靡的DBMS提供联合数据访谈的恢宏,那些 DBMS 满含mysql, PostgreSQL 等等。因而,要利用 Yii DAO,PDO 增添和特定的 PDO 数据库驱动(比方 PDO_MYSQL卡塔尔国 必得安装。
Yii DAO 主要包括如下多个类:
CDbConnection: 代表三个数据库连接。
CDbCommand: 代表一条通过数据库推行的 SQL 语句。
CDbDataReader: 代表二个只前行移动的,来自三个询问结果聚焦的行的流。
CDbTransaction: 代表一个数据库事务。
1、建设布局数据库连接

WHERE子句
// 在where()中使用 AND
where(array('and', 'id=:id', 'username=:username'), array(':id'=>$id, ':username'=>$username);
// 在where(卡塔尔国中应用 O路虎极光 与 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%
    // 再这么复杂下去, 使用这种措施几乎是自寻短见行为。

接下来大家就足以由此 Yii::app(卡塔尔(قطر‎->db 访谈数据库连接了。它已经被电动激活了,除非大家非常安排了 CDbConnection::autoConnect 为 false。通过这种办法,那么些独立的DB连接就可以在我们代码中的比较多地点分享。
2、执行SQL语句

// 利用别称消除歧义
$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();

3、获取查询结果

//实行SQL语句要求CDbCommand对象,而该目的由CdbConnection::createCommand(卡塔尔(英语:State of Qatar)再次回到,因而:
$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

$dataReader=$command->query(卡塔尔国; // 重复调用 read(卡塔尔(英语:State of Qatar) 直到它回到 false

做客数据库前供给树立数据库连接;使用DAO构建八个虚幻数据库链接:
$connection = new CDbConnection($dsn, $username, $password);
$connection->active = true;     // 只有激活了一而再接二连三才得以应用
// 想要关闭连接,可以如此:
$connection->active = false;

 } catch(Exception $e卡塔尔(英语:State of Qatar) // 假使有一条查询退步,则会抛出特别

// 表中的每叁个字段都由APRADO类中的贰脾气质表示,假若筹划透过质量访谈表中未有字段,将会抛出多少个十分。

是因为 CDbConnection 世襲自 CApplicationComponent,我们也能够将其看做多少个应用组件 使用。要如此做的话,请在 应用配置 中配置三个 db (或其余名字)应用组件如下:

// 使用A帕杰罗更新记录
// 叁个超人的实例:
$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);

$value=$command->queryScalar(卡塔尔; // 查询并重临结果中首先行的率先个字段

// RAR:Relatived Actie Record
// RACR-V本质上便是施行关周密据查询

HTML " data-pbcklang="html" data-pbcktabsize="4">
$connection=new CDbConnection($dsn,$username,$password卡塔尔国; // 建构连接。你能够动用 try...catch 捕获或者抛出的不得了

// Yii完毕了把一条完整的SQL语句完完全全肢解的手艺,举个例子那样:
$user = Yii::app(卡塔尔->db->createCommand(卡塔尔(英语:State of Qatar);    // 哈,笔者爱怜的方法链!
        ->select('id, username, profile')
        ->from('tbl_user u')
        ->join('tbl_profile p', 'u.id=p.user_id')
        ->where('id=:id', array(':id'=>$id)
        ->queryRow(卡塔尔(英语:State of Qatar);       // 重回相配的结果集的首先行
// 其实那条语句能够那样写: $newSQL ='SELECT id, username, profile from tbl_user u INNER JOIN tbl_profile p ON u.id = p.user_id WHERE u.id =:id'
// 肢解法反倒让自家感到嫌恶了。。。。。。。。。

 'connectionString'=>'mysql:host=localhost;dbname=testdb',

// 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(卡塔尔(قطر‎;   // 在此多少个管理中回滚
}

 'password'=>'password',

// query(卡塔尔(英语:State of Qatar)重回的是象征结果集的靶子而非间接的结果,由此要得到结果集的笔录能够这么:
$dataReader=$command->query();
// CDbDataReader::read(卡塔尔(英语:State of Qatar)可以一遍获得少年老成行数据,到末尾时重返false
while(($row=$dataReader->read())!==false)
// CDbDataReader实现了迭代器接口因而得以选取foreach遍历
foreach($dataReader as $row)
// 三遍性重返全部的记录(数组卡塔尔
$rows=$dataReader->readAll();

// 一条带有四个占位符 ":username" 和 ":email"的 SQL
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// 用实际的客户名轮换占位符 ":username"
$command->bindParam(":username",$username,PDO::PARAM_STR);
// 用实际的 Email 替换占位符 ":email"
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// 使用新的参数集插入另意气风发行
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();

// 若是提到查询实施后并未有相称的结果,重返将会是NULL或空的数组。

 'username'=>'root',

$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',
                                    )
                             );

要制止 SQL 注入攻击 并提升重复实施的 SQL 语句的功效,你能够"希图(prepare)"一条含有可选参数占位符的 SQL 语句,在参数绑依期,那几个占位符将被轮番为实在的参数。
参数占位符能够是命名的 (表现为三个唯大器晚成的暗号卡塔尔国 或未命名的 (表现为叁个问号卡塔尔(قطر‎。调用 CDbCommand::bindParam(卡塔尔(英语:State of Qatar) 或 CDbCommand::bindValue(卡塔尔(قطر‎以应用实际参数替换这个占位符。那一个参数无需使用引号引起来:底层的数据库驱动会为您解决那几个。参数绑定必得在 SQL 语句实践以前变成。

CDbConnection世襲自CApplicationComponent,所以他得以像组件同样在另各地方使用。因而得以那样访谈:
Yii::app()->db 

 ),

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

 // $connection=new CDbConnection($dsn,$username,$password);

queryXXX(卡塔尔(英语:State of Qatar)格局的方法会直接回到相配的记录集结,当query(卡塔尔(英语:State of Qatar)不是,他回去三个意味结果集的目的

初藳链接:

// 其它的意气风发对足以动用的措施:
// 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);

7、使用表前缀

// 实例化三个A奥迪Q3,填写音讯(肖似于填充顾客提交的音讯卡塔尔,然后保留
$post = new Post;
$post->title = 'sample post';
$post->content = 'content for the sample post';
$post->create_time = time();
$post->save();  // 保存/插入

 while(($row=$dataReader->read())!==false卡塔尔国 { ... } // 使用 foreach 遍历数据中的每豆蔻梢头行

// 假设大家想了然客户中哪个人发过帖子,况且帖子的情景是“公开”。我们并不关怀客商公布过的帖子的从头到尾的经过。
$user = User::model()->with('posts')->findAll();
                'VS'
$user = User::model()->with(array(
                                    'posts' => array(
                                                        'select' => false,
                                                        'joinType' => 'INNER JOIN',
                                                        'condition' => 'posts.published = 1'
                                                    ),
                                 )
                           )->findAll();
// 重临的将会是有所发过帖子(且帖子已经公开卡塔尔的顾客

array(

// 总括查询
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)'),
        );
    }
}

$sql="SELECT username, email FROM tbl_user";
$dataReader=$connection->createCommand($sql)->query();
// 使用 $username 变量绑定第一列 (username卡塔尔(قطر‎
$dataReader->bindColumn(1,$username);
// 使用 $email 变量绑定第二列 (email卡塔尔国
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
    // $username 和 $email 含有当前进中的 username 和 email
}

// Active Record
// 使用A奥迪Q7以面向对象的不二秘技访问数据库,A凯雷德达成了ORM本领
// 当Post类表示表tbl_post时,大家能够应用那样的诀窍插入一条数据
$post = new Post();
$post->title = 'new title';
$post->content = 'new content';
$post->save(卡塔尔国;      // 保存即插入

 ...... 'components'=>array(

// 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(卡塔尔(英语:State of Qatar)->find($criteria卡塔尔国;   // 无需第三个参数
// 另黄金时代种越来越好的写法
$post=Post::model()->find(array(
        'select' => 'title',
        'condition' => 'postID=:postID',
        'params' => array(':postID' => 10)
        ));

$rows=$dataReader->readAll();

// 增添了如此多,你都不清楚合成后的SQL长啥样了,可以选择->text查看(魔术点子卡塔尔国
// 假若认为组合的SQL未有不当,这就推行他,加多->queryAll(卡塔尔国; 那能够收获全体相称的结果集。
// 当然,借使您分明实践的结果集中独有豆蔻梢头行,能够增进->queryRow(卡塔尔(英语:State of Qatar);来直接获取。
// 要是几个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();

要接收表前缀,配置 CDbConnection::tablePrefix  属性为所企盼的表前缀。然后,在 SQL 语句中接收 {{TableName}} 代表表的名字,个中的 TableName  是指不带前缀的表名。比方,假如数据库含有三个名叫 tbl_user 的表,而 tbl_ 被安排为表前缀,那大家就能够利用如下代码推行客户相关的询问:
 
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();

DSN 的格式决意于所利用的 PDO 数据库驱动。总体来讲, DSN 要含有 PDO 驱动的名字,跟上两个冒号,再跟上驱动特定的连天语法。可查阅 PDO 文档获取越多消息。下边是二个常用DSN格式的列表。

'emulatePrepare'=>true, // needed by some MySQL installations

要树立二个数据库连接,创造三个 CDbConnection  实例并将其激活。连接到数据库须求一个数据源的名字(DSN)以钦定连接新闻。客商名和密码也可能会用到。当连接到数据库的经过中发生错误时 (举例,错误的 DSN 或无效的客商名/密码卡塔尔(قطر‎,将会抛出三个老大。

 ......

$connection->active=true;

在 CDbCommand::query(卡塔尔  生成 CDbDataReader  实例之后,你能够经过重新调用 CDbDataReader::read(卡塔尔(قطر‎  获取结果中的行。你也能够在 PHP 的 foreach 语言布局中运用 CDbData里德r  生机勃勃行行检索数据。

$row=$command->queryRow(卡塔尔国; // 查询并重回结果中的第黄金年代行

编辑:编程 本文来源:匹配结果集的一行记录,数据访问对象 (DAO)【澳

关键词: