Zend Framework教程之Zend_Db_Table用法详解


Posted in PHP onMarch 21, 2016

本文实例讲述了Zend_Db_Table用法。分享给大家供大家参考,具体如下:

1. 简介

Zend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到 数据库,为数据库模式检查表对象,并对该表进行操作和查询.

2. 开始

首先需要为抽象类zend_db_table(ares注:该类为抽象类,所以不能直接实例 化,只能先继承该类,然后实例化子类)设定一个默认对数据库adapter;除非你 指定其他类型数据库adapter,否则,所有的zend_db_table类实例都会使用 默认adapter.

<?php
// 建立一个 adapter
require_once 'Zend/Db.php';
$params = array (
  'host'   => '127.0.0.1',
  'username' => 'malory',
  'password' => '******',
  'dbname'  => 'camelot'
);
$db = Zend_Db::factory('PDO_MYSQL', $params);
// 为所有的Zend_Db_Table对象设定默认的adapter
require_once 'Zend/Db/Table.php';
Zend_Db_Table::setDefaultAdapter($db);
?>

接下来,我们假定数据库中存在一个名为”round_table”的表.要对该表 使用zend_db_table,只需继承zend_db_table类创建一个名为RoundTable的 新类.然后我就可以通过该类在数据库中的round_table表中检查,操作数据 行并且取得数据结果.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
?>

3. 表名和主键

默认情况下,zend_db_table类会将其类名当作数据库中表名(大小写不同 的地方需要添加"_").例如,一个名为SomeTableName的zend_db_table类在 数据库中就对应表”some_table_name”.假如不希望将类名与数据库表名以 这种添加下划线的形式进行对应,可以在定义该类时对$_name进行重构.

<?php
class ClassName extends Zend_Db_Table
{
  // 默认表名为 'class_name'
  // 但是我们也可以对应其它表
  protected $_name = 'another_table_name';
}
?>

zend_db_table类默认字段”id”为表的主键(该字段最好为自增的,但并不 是必须的).假如该表的主键并不是名为”$id”,你可以在定义表实体类时 对$_primary进行重构

<?php
class ClassName extends Zend_Db_Table
{
  // 默认主键为'id'
  // 但我们也可以设定其他列名为主键
  protected $_primary = 'another_column_name';
}
?>

你也可以通过表实体类中_setup()方法设定这些变量;但是需要确保在修改 后再执行一次parent::_setup()方法.

<?php
class ClassName extends Zend_Db_Table
{
  protected function _setup()
  {
    $this->_name = 'another_table_name';
    $this->_primary = 'another_column_name';
    parent::_setup();
  }
}
?>

4. 插入数据

要在表中插入一行新数据,只需要将列名:数据的关联数组作为参数,调 用insert()方法即可.

(zend framework)会自动对数据进行加引号处理, 并返回插入的最后一行的id值
(注意:这里不同于 zend_db_adapter::insert方法,后者返回的是插入的行数).

<?php
//
// INSERT INTO round_table
//   (noble_title, first_name, favorite_color)
//   VALUES ("King", "Arthur", "blue")
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$data = array(
  'noble_title' => 'King',
  'first_name' => 'Arthur',
  'favorite_color' => 'blue',
)
$id = $table->insert($data);
?>

5. 更新数据

要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调 用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会 修改表中数据并返回被修改的行数.

(Zend frameword)将会自动对修改对数据进行加引号处理,但是这种检查不包括 条件分句,所以你需要使用该表的zend_db_adapter对象完成该工作. 

class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$set = array(
  'favorite_color' => 'yellow',
)
$where = $db->quoteInto('first_name = ?', 'Robin');
$rows_affected = $table->update($set, $where);

6. Deleting Rows

要删除表中的数据,我们可以调用delete()方法,同时通过一个where条件 分句来决定需要删除的行.该方法将会返回被删除的行数.

(zend framework)不会对条件分句进行加引号处理,所以你需要使用该表 的zend_db_adapter对象完成该工作

<?php
//
// DELETE FROM round_table
//   WHERE first_name = "Patsy"
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto('first_name = ?', 'Patsy');
$rows_affected = $table->delete($where);
?>

7. 根据主键查找数据

通过调用find()方法,可以使用主键值轻松地在表中检索数据.假如你只想要查询某 一条数据,该方法将回返回一个zend_db_table_row对象,而当你想要查询多条记录时 ,将会返回一个zend_db_table_rowset对象.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
// SELECT * FROM round_table WHERE id = "1"
$row = $table->find(1);
// SELECT * FROM round_table WHERE id IN("1", "2", 3")
$rowset = $table->find(array(1, 2, 3));
?>

8. 取回一条记录

虽然通过主键找到相应数据行是很便利的事情,但是在更多的时候,我们是 通过其他一些非主键的条件来查找数据行的.zend_db_table提供了一个 fetchRow()方法可以实现这个功能.我们可以通过一个where条件语句(和一 个可选的order语句)调用fetchRow()方法,然后zend_db_tabel将会返回满 足条件的第一行数据的zend_db_table_row对象.

注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要 通过zend_db_adapter进行数据处理

<?php
//
// SELECT * FROM round_table
//   WHERE noble_title = "Sir"
//   AND first_name = "Robin"
//   ORDER BY favorite_color
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto('noble_title = ?', 'Sir')
    . $db->quoteInto('AND first_name = ?', 'Robin');
$order = 'favorite_color';
$row = $table->fetchRow($where, $order);
?>

9. 取回多条记录

假如需要一次检索多条记录.可以使用fetchAll()方法.和使用fetchRow()方法类 似,该方法不仅仅可以设定where和order分句,也可以设定limit-count和 limit-offset值来限制返回的结果数.执行该方法后,把选择的结果作为一个 Zend_Db_Table_Rowset对象返回.
注意,(zend framework) 将不会对where语句进行加引号处理,所以你需要 通过zend_db_adapter进行数据处理.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
// SELECT * FROM round_table
//   WHERE noble_title = "Sir"
//   ORDER BY first_name
//   LIMIT 10 OFFSET 20
$where = $db->quoteInto('noble_title = ?', 'Sir');
$order = 'first_name';
$count = 10;
$offset = 20;
$rowset = $table->fetchAll($where, $order, $count, $offset);
?>

10. Adding Domain Logic

作为Zend Framework的表模块,Zend_Db_Table将它自己很好的封装到独特的domain logic下. 例如,你可以重载insert()和update()方法,以实现在数据更改提交前的操作和验证.

<?php
class RoundTable extends Zend_Db_Table
{
  public function insert($data)
  {
    // 添加一个时间戳
    if (empty($data['created_on'])) {
      $data['created_on'] = time();
    }
    return parent::insert($data);
  }
  public function update($data)
  {
    // 添加一个时间戳
    if (empty($data['updated_on'])) {
      $data['updated_on'] = time();
    }
    return parent::update($data);
  }
}
?>

类似的,你也可以设定自己的find()方法,通过主键外的其他字段来查询数据.

<?php
class RoundTable extends Zend_Db_Table
{
  public function findAllWithName($name)
  {
    $db = $this->getAdapter();
    $where = $db->quoteInto("name = ?", $name);
    $order = "first_name";
    return $this->fetchAll($where, $order);
  }
}
?>

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

PHP 相关文章推荐
Discuz板块横排显示图片的实现方法
May 28 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
php错误级别的设置方法
Jun 17 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 #PHP
PHP常见数组函数用法小结
Mar 21 #PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 #PHP
Zend Framework入门知识点小结
Mar 19 #PHP
Zend Framework缓存Cache用法简单实例
Mar 19 #PHP
Zend Framework基本页面布局分析
Mar 19 #PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 #PHP
You might like
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP的自定义模板引擎
2017/03/24 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
React实现轮播效果
2020/08/25 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
励志演讲稿200字
2014/08/21 职场文书
教师聘用意向书
2015/05/11 职场文书
趣味运动会广播稿
2015/08/19 职场文书
利用python做表格数据处理
2021/04/13 Python
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫