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

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

时间:2014-09-06 16:10来源:网络整理 作者:网络 点击:
分享到:
join()方法及其变种指定如何与其他表连接,使用内部联接,左外连接,右外部联接,交叉连接,或自然连接。 $table 参数指定要加入哪个表。表名可以包含

join()方法及其变种指定如何与其他表连接,使用内部联接,左外连接,右外部联接,交叉连接,或自然连接。 $table 参数指定要加入哪个表。表名可以包含数据库的前缀和 / 或别名。该方法将引用表名,除非它包含一个插入语,即一个DB表达式或子查询。 $conditions 参数指定连接条件。它的语法与where() 相同。$params 参数指定绑定到整个查询的参数。

值得注意的是,它不像其他的查询生成器方法,每次调用一个join方法都会追加到SQL中。

下面是一些例子:

// JOIN `tbl_profile` ON user_id=id
join('tbl_profile', 'user_id=id')
// LEFT JOIN `pub`.`tbl_profile` `p` ON p.user_id=id AND type=1
leftJoin('pub.tbl_profile p', 'p.user_id=id AND type=:type', array(':type'=>1))

group()

function group($columns)

group() 方法指定查询的GROUP BY。 $columns 参数指定列进行分组,它可以是一个用逗号分隔的列的字符串,或者一个列的数组。列名称可以包含表前缀。该方法将自动引用列名,除非一列包含一些括号(即是一个 DB 表达式)。

下面是一些例子:

// GROUP BY `name`, `id`
group('name, id')
// GROUP BY `tbl_profile`.`name`, `id`
group(array('tbl_profile.name', 'id'))

having()

function having($conditions, $params=array())

having() 方法指定查询的 HAVING。它的使用方式与 where() 相同。

下面是一些例子:

// HAVING id=1 or id=2
having('id=1 or id=2')
// HAVING id=1 OR id=2
having(array('or', 'id=1', 'id=2'))

union()

function union($sql)

union() 方法指定查询 UNION。它使用UNION操作附加到现有的SQL上。调用union()多次将现有的SQL附加多个表。

下面是一些例子:

// UNION (select * from tbl_profile)
union('select * from tbl_profile')

执行查询(Executing Queries)

调用上面查询生成器的方法来建立一个查询后,我们可以调用DAO方法数据访问对象执行查询。例如,我们可以调用 CDbCommand::queryRow() 获得连续的结果,或者使用 CDbCommand::queryAll() 立刻得到所有行。

例子:

$users = Yii::app()->db->createCommand()
  ->select('*')
  ->from('tbl_user')
  ->queryAll();

检索表(Retrieving SQLs)

除了执行查询生成器的查询,我们也可以获取相应的SQL语句。这可以通过调用 CDbCommand::getText() 获得。

$sql = Yii::app()->db->createCommand()
  ->select('*')
  ->from('tbl_user')
  ->text;

如果有任何参数必须绑定到查询的,他们可以通过 CDbCommand::params 的属性绑定。

建立查询的替代语法(Alternative Syntax for Building Queries)

有时,使用方法链来建立一个查询可能不是最佳的选择。Yii的查询生成器允许使用对简单象属性赋值的方式去建立查询。特别是,每个查询生成器的方法都有一个具有相同名称的属性。给属性赋值相当于调用相应的方法。例如,下面两个语句是等价的,假设$command 代表 CDbCommand 对象:

$command->select(array('id', 'username'));
$command->select = array('id', 'username');

此外, CDbConnection::createCommand() 方法可以把一个数组作为参数。数组中的键值对将被用来初始化创建的 CDbCommand 实例的属性。这意味着,我们可以使用下面的代码来建立一个查询:

$row = Yii::app()->db->createCommand(array(
  'select' => array('id', 'username'),
  'from' => 'tbl_user',
  'where' => 'id=:id',
  'params' => array(':id'=>1),
))->queryRow();

建立多个查询(Building Multiple Queries)

一个 CDbCommand 实例可以重复使用多次建立几个查询。建立一个新的查询之前,需要调用 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();

3. 建立数据操作查询(Building Data Manipulation Queries)

精彩图集

赞助商链接