上一篇介紹 PHP 使用 DAO(數(shù)據(jù)庫訪問對象接口)訪問數(shù)據(jù)庫的方法,使用 DAO 需要程序員編寫 SQL 語句,對于一些復雜的 SQL 語句,Yii 提供了 Query Builder 來幫助程序員生成 SQL 語句,Query Builder 提供了一中面向?qū)ο蟮姆椒▌討B(tài)創(chuàng)建 SQL 語句,打個不十分恰當?shù)谋容^,PHP 的 DAO 和.Net 的 DAO 接口非常類型,Query builder 就有點像 LINQ 了,盡管和 LINQ 比起來功能小很多。對于一些簡單的 SQL 查詢,通常不需要借助于 Query Builder,比如上篇中的查詢 Employee 表格。
和直接使用 SQL 語句相比,使用 Query Builder 具有下面好處:
本例查詢 Chinook 的兩個表 Customer 和 Employee, 查詢 EmployeeId=4 管理的所有客戶的聯(lián)系信息。
如果使用 SQL 查詢,可以寫作:
SELECT c.FirstName, c.LastName , c.Address,c.Email
FROM customer c
INNER JOIN
employee e
ON c.SupportRepId=e.EmployeeId
WHERE e.EmployeeId=4
本例使用 Query Builder 創(chuàng)建 SQL 查詢,修改 SiteController 的 indexAction 方法:
public function actionIndex()
{
$model = array();
$connection=Yii::app()->db;
$command=$connection->createCommand()
->select('c.FirstName, c.LastName, c.Address,c.Email')
->from('customer c')
->join('employee e','c.SupportRepId=e.EmployeeId')
->where('e.EmployeeId=4');
$dataReader=$command->query();
// each $row is an array representing a row of data
foreach($dataReader as $row)
{
$customer= new DataModel();
$customer->firstName=$row['FirstName'];
$customer->lastName=$row['LastName'];
$customer->address=$row['Address'];
$customer->email=$row['Email'];
$model[]=$customer;
}
$this->render('index', array(
'model' => $model,
));
}
可以看到 Query Builder 也是使用 CDbCommand , CDbCommand 提供了如下查詢數(shù)據(jù)的方法:
此外數(shù)據(jù)定義方法:
可以看到 CDbCommand 支持的方法基本上和 SQL 語句的關鍵字一一對應,使不使用 Query Builder 全憑個人愛好,對應簡單的 SQL 語句可以直接使用 SQL 語句,對于較復雜的查詢可以借助于 Query Builder。
本例顯示結(jié)果:
http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/25.1.jpg" alt="picture25.1" />
本例下載