上一篇介紹PHP使用DAO(資料庫訪問對象介面)訪問資料庫的方法,使用DAO需要程式員編寫SQL語句,對於一些複雜的SQL語 句,Yii提供了Query Builder來協助程式員產生SQL語句,Query Builder提供了一中物件導向的方法動態建立SQL語句,打個不 十分恰當的比較,PHP 的DAO和.Net 的DAO介面非常類型,Query builder 就有點像LINQ了,儘管和LINQ比起來功能小很多。對 於一些簡單的SQL查詢,通常不需要藉助於Query Builder,比如上篇中的查詢Employee表格。
和直接使用SQL語句相比, 使用Query Builder具有下面好處:
支援通過程式動態建立比較複雜的SQL查詢。
自動為建立的SQL語句中的表名,列表 添加引號以避免和SQL保留的標誌符產生衝突。
指定為參數添加引號並儘可能的使用參數綁定以減小SQL Injection的風險。
使用Query Builder不直接編寫SQL語句,而提供了一定程度上的資料庫抽象,從而為切換資料庫類型提供了便利。
本例查詢Chinook的兩個表Customer和Employee, 查詢EmployeeId=4管理的所有客戶的聯絡資訊。
如果使用SQL查 詢,可以寫作:
SELECT c.FirstName, c.LastName , c.Address,c.Email。FROM customer cINNER JOINemployee eON c.SupportRepId=e.EmployeeId
WHERE e.EmployeeId=4本例使用Query Builder建立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 dataforeach($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提供了如下查詢資料的方法:
select()selectDistinct()from()where()join()leftJoin()rightJoin()crossJoin()naturalJoin()group()having()order()limit()offset()union()
此外資料定義方法:
createTable()renameTable()dropTable()truncateTable()addColumn()renameColumn()alterColumn()dropColumn()是createIndex()dropIndex()
可以看到CDbCommand支援的方法基本上和SQL語句的關鍵字一一對應,使不使用Query Builder全憑個人愛好,對應簡單的SQL語句可以直接使用SQL語句,對於較複雜的查詢可以藉助於Query Builder。
本例顯示結果:
以上就是PHP開發架構Yii Framework教程(25) 資料庫-Query Builder樣本的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!