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

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

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