龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

Yii查询生成器(Query Builder)用法实例教程

时间:2014-09-06 16:10来源:网络整理 作者:网络 点击:
分享到:
这篇文章主要介绍了Yii查询生成器(Query Builder)用法,包括了各种常见的查询操作,需要的朋友可以参考下

本文为yii官网英文文档的翻译版本,主要介绍了Yii查询生成器(Query Builder)的用法。分享给大家供大家参考之用。具体如下:

首先,Yii的查询生成器提供了用面向对象的方式写SQL语句。它允许开发人员使用类的方法和属性来指定一个SQL语句的各个部分。然后,组装成一个有效的SQL语句,可以通过调用DAO数据访问对象的描述方法为进一步执行。以下显示了一个典型的使用查询生成器建立一个select语句:

$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();

当你在应用程序中需要组装SQL语句的程序,或基于一些条件逻辑时,最好使用查询生成器。使用查询生成器的好处主要包括:

①.它可以建立复杂的SQL语句编程。

②.它会自引用表名和列名防止SQL保留字和特殊字符的冲突。

③.它还可以引用参数值和使用参数绑定,这有助于减少SQL注入攻击的风险。

④.它提供了一定程度的数据库抽象,简化了迁移到不同的数据库平台的成本。

它不强制使用查询生成器。事实上,如果你的查询是简单的,它是更容易和更快的直接写SQL语句。

注:查询生成器不能用于修改现有的查询指定为SQL语句。例如,下面的代码将不能工作:

$command = Yii::app()->db->createCommand('SELECT * FROM tbl_user');
// the following line will NOT append WHERE clause to the above SQL
$command->where('id=:id', array(':id'=>$id));

换句话说,不要混合使用普通的SQL和查询生成器。

1. 制备查询生成器(Preparing Query Builder)

Yii的查询生成器是从 CDbCommand 提供主要数据库查询类,描述数据访问对象。

开始使用查询生成器,我们创造了 CDbCommand 的一个新实例,

$command = Yii::app()->db->createCommand();

我们使用 Yii::app()->db 来获得数据库连接,然后调用 CDbConnection::createCommand() 创建所需的命令实例。

请注意,将整个SQL语句放入 createcommand() ,叫做数据访问对象,我们需呀把设置它为空。这是因为我们将在下面的解释中使用查询生成器添加SQL语句的各个部分的方法。

2. 建立数据检索查询(Building Data Retrieval Queries)

数据检索查询是指选择SQL语句。查询生成器提供了一套方法来建立一个SELECT语句的各个部分。因为所有这些方法返回 CDbCommand 的实例,我们可以使用方法链调用他们,如图所示,在本节开头的例子。

select():             指定查询的选择部分                       specifies the SELECT part of the query
selectDistinct():  指定查询不重复的选择部分               specifies the SELECT part of the query and turns on the DISTINCT flag
from():              指定查询的FROM                           specifies the FROM part of the query
where():            指定查询的WHERE                        specifies the WHERE part of the query
andWhere():      用and的方式添加到WHERE的条件中  appends condition to the WHERE part of the query with AND operator
orWhere():        用or的方式添加到WHERE的条件中    appends condition to the WHERE part of the query with OR operator
join():               添加一个内部联接的查询片段            appends an inner join query fragment
leftJoin():          追加一个左外连接查询片段               appends a left outer join query fragment
rightJoin():        追加一个右外部联接查询片段            appends a right outer join query fragment
crossJoin():       追加一个交叉连接查询片段               appends a cross join query fragment
naturalJoin():     追加一个自然连接查询片段               appends a natural join query fragment
group():            指定查询的GROUP BY                   specifies the GROUP BY part of the query
having():           指定查询的HAVING                       specifies the HAVING part of the query
order():            指定查询的ORDER BY                    specifies the ORDER BY part of the query
limit():              指定查询的LIMIT                           specifies the LIMIT part of the query
offset():           指定查询的OFFSET                        specifies the OFFSET part of the query
union():           添加查询的UNION                          appends a UNION query fragment

精彩图集

赞助商链接