- 1 第一个应用 Hello World
- 2 Yii Web 应用基础
- 3 为应用添加日志
- 4 Hangman 猜单词游戏实例
- 5 URL 管理
- 6 CComponent 组件
- 7 使用 CHtml 创建 Form
- 8 使用 FormModel
- 9 UI 组件 Widget 概述
- 10 UI 组件 自定义组件
- 11 UI 组件 ActiveForm 示例
- 12 UI 组件 ClipWidget 示例
- 13 UI 组件 ContentDecorator 示例
- 14 UI 组件 MaskedTextField 示例
- 15 UI 组件 MultiFileUpload 示例
- 16 UI 组件 StarRating 示例
- 17 UI 组件 TabView 示例
- 18 UI 组件 TextHighlighter 示例
- 19 UI 组件 TreeView 示例
- 20 UI 组件 Captcha 示例
- 21 UI 组件 自定义 Captcha 示例
- 22 UI 组件 Zii 组件简介
- 23 数据库-概述
- 24 数据库-DAO 示例
- 25 数据库-Query Builder 示例
- 26 数据库-Active Record 示例
- 27 数据库-关联 Active Record 示例
- 28 Data Provider 简介
- 29 Zii 组件-Menu 示例
- 30 Zii 组件-ListView 示例
- 31 Zii 组件-DetailView 示例
- 32 Zii 组件-GridView 示例
- 33 Zii 组件-Accordion 示例
- 34 Zii 组件-AutoComplete 示例
- 35 Zii 组件-Button 示例
- 36 Zii 组件-DatePicker 示例
- 37 Zii 组件-Dialog 示例
- 38 Zii 组件-ProgressBar 示例
- 39 Zii 组件-Slider 示例
- 40 Zii 组件-SliderInput 示例
- 41 Zii 组件-Tabs 示例
- 42 Zii 组件-Draggable 示例
- 43 Zii 组件-Droppable 示例
- 44 Zii 组件-Resizable 示例
- 45 Zii 组件-Selectable 示例
- 46 Zii 组件-Sortable 示例
- 47 主题 Theme 示例
- 48 多国语言示例
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
25 数据库-Query Builder 示例
上一篇介绍 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 c INNER JOIN employee e ON 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 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 提供了如下查询数据的方法:
- 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。
本例显示结果:
图片 25.1 picture25.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论