本文为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