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编程之高级技巧——利用Mysql函数
Oct 09 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
基于PHP静态类的原罪详解
May 06 PHP
php实现递归与无限分类的方法
Feb 16 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
php图片上传类 附调用方法
May 15 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP实现简单计算器小程序
Aug 28 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 29 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 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实现的mongodb操作类
2015/05/28 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php数组遍历类与用法示例
2019/05/24 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
javascript 获取网页参数系统
2008/07/19 Javascript
Javascript中Eval函数的使用说明
2008/10/11 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
职员竞岗演讲稿
2014/05/14 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
停发工资证明范本
2015/06/12 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL