Yii框架自定义数据库操作组件示例


Posted in PHP onNovember 11, 2019

本文实例讲述了Yii框架自定义数据库操作组件。分享给大家供大家参考,具体如下:

Yii 的数据库操作对象提供的方法确实很方便。 但是有的时候我们已经习惯了我们以前编写php的数据库操作语法,没有那么多时间去仔细看每个Yii提供的数据库操作语法,怎么办呢? 那就是一边学习,一边二次封装自己习惯的数据库操作类。 以后我们使用数据库操作对象,就用我们自己定义的组件去操作。

将我的数据库操作组件注册进配置文件web.php 中

array(
  'components' => array(
    //自定义数据库操作组件
    'dbOper'  => array(
      'class'   => 'app\components\DbOper\realization\DbRealization1'
    ),
    //Yii 框架数据库连接组件
    'db'      =>  array(
        'class'     => 'yii\db\Connection',
        'dsn'      => 'mysql:host=localhost;dbname=yii',
        'username'   => 'root',
        'password'   => '123456',
        'charset'    => 'utf8'
      );
  )
)

然后我们就可以在components 目录下定义我们的数据库操作类了。 因为,不知道怎么去获得php pdo 的原生操作对象,所以这里是对Yii数据库操作类的一个二次封装。

接口文件 DbOper.php 自定义的数据库操作类都得实现该接口

<?php
namespace app\components\DbOper;
/**
 * 自定义数据库操作组件 依赖系统定义组件db
 */
interface DbOper
{
  /**
   * 查询多条数据
   * @param
   * String $sql 需要查询的sql语句
   * array $keyVal 字段映射
   * @return
   * array 查询结果
   */
  public function fetchAll($sql='',$keyVal=array());
  /**
   * 查询一条数据 原生sql
   * @param
   * String $sql 需要查询的sql语句
   * array $keyVal 字段映射
   * @return
   * array 查询结果
   */
  public function fetch($sql='',$keyVal=array());
  /**
   * 添加数据
   * @param
   * String $tableName 表名
   * array $values 要插入的数据
   * @return
   * int 受影响的行数
   */
  public function insert($tableName='',$values=array());
  /**
   * 更新数据
   * @param
   * String $tableName 表名
   * array | String $where 修改条件 为 1 时更改该表所有的行
   * array $update 要更新的数据 
   * @return
   * int 受影响的行数
   */
  public function update($tableName='',$where='',$update=array());
  /**
   * 删除数据
   * @param
   * String $tableName 表名
   * array | String $where 删除条件
   * @return
   * int 受影响的行数
   */
  public function delete($tableName='',$where='');
  /**
   * 事务处理
   * @param
   * array $sqls 要执行的sql集合
   * return
   * boolean 是否执行成功
   */
  public function transcation($sqls = array());
  /**
   * 获得数据库链接
   */
  public function getYiiDbConnection();
}

针对DbOper 接口的实现类 DbRealization1.php

<?php
namespace app\components\DbOper\realization;
use Yii;
use app\components\DbOper\DbOper;
/**
 * 自定义数据库操作组件实现类
 */
class DbRealization1 implements DbOper
{
  private $db = null;
  /**
   * interface @Override
   */
  public function fetchAll($sql='',$keyVal=array())
  {
    if($sql === '')
      return array();
    $result = $this->getQueryObj($sql,$keyVal)->queryAll();
    if($result)
      return $result;
    else
      return array();
  }
  /**
   * interface @Override
   */
  public function fetch($sql='',$keyVal=array())
  {
    if($sql === '')
      return array();
    $result = $this->getQueryObj($sql,$keyVal)->queryOne();
    if($result)
      return $result;
    else
      return array();
  }
  /**
   * interface @Override
   */
  public function insert($tableName='',$values=array())
  {
    if($tableName === '')
      return 0;
    $insert = $this->getYiiDbConnection()->createCommand();
    if(is_array($values[0]))
    {
      $keys = array_keys($values[0]);
      return $insert->batchInsert($tableName,$keys,$values)->execute();
    }
    return $insert->insert($tableName,$values)->execute();
  }
  /**
   * interface @Override
   */
  public function update($tableName='',$where = '',$update=array())
  {
    if($tableName === '')
      return 0;
    if($where === '')
      return 0;
    return $this->getYiiDbConnection()
        ->createCommand()
        ->update($tableName,$update,$where)
        ->execute();
  }
  /**
   * interface @Override
   */
  public function delete($tableName='',$where='')
  {
    if($tableName === '')
      return 0;
    return $this->getYiiDbConnection()
        ->createCommand()
        ->delete($tableName,$where)
        ->execute();
  }
  /**
   * 获得查询操作对象
   * @return 
   * Object 
   */
  private function getQueryObj($sql='',$keyVal=array())
  {
    $query = $this->getYiiDbConnection()->createCommand($sql);
    if(!empty($keyVal))
      $query->bindValues($keyVal);
    return $query;
  }
  /**
   * interface @Override
   */
  public function transcation($sqls = array())
  {
    if(empty($sqls))
      return false;
    $db = $this->getYiiDbConnection();
    $outerTransaction = $db->beginTransaction();
    $runClient = true;
    try
    {
      foreach($sqls as $sql)
      {
        $db->createCommand($sql)->execute();
      }
      $outerTransaction->commit();
    }catch(\Exception $e){
      $runClient = false;
      $outerTransaction->rollback();
    }
    return $runClient;
  }
  /**
   * interface @Override
   */
  public function getYiiDbConnection()
  {
    if($this->db === null)
    {
      $this->db = Yii::$app->db;
    }
    return $this->db;
  }
}

注意:我的自定义数据库操作类 依赖 Yii::$app->db 这个组件, 也就是框架自带的数据库连接组件

然后我们就可以通过 Yii::$app->dbOper 去操作数据库了。

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

PHP 相关文章推荐
PHP文本数据库的搜索方法
Oct 09 PHP
基于mysql的bbs设计(四)
Oct 09 PHP
PHP小程序自动提交到自助友情连接
Nov 24 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
php关联数组快速排序的方法
Apr 17 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
php接口隔离原则实例分析
Nov 11 #PHP
Yii框架布局文件的动态切换操作示例
Nov 11 #PHP
Yii框架模拟组件调用注入示例
Nov 11 #PHP
在Laravel中使用MongoDB的方法示例
Nov 11 #PHP
PHP使用递归按层级查找数据的方法
Nov 10 #PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 #PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 #PHP
You might like
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
document.getElementById介绍
2011/09/13 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
VUE重点问题总结
2018/03/19 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
应届大专生自荐书
2014/06/16 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
综治目标管理责任书
2015/05/11 职场文书
幼儿园见习总结
2015/06/23 职场文书
房产遗嘱范本
2015/08/06 职场文书
清明节主题班会
2015/08/14 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript