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数据库代码
Mar 10 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
php preg_replace替换实例讲解
Nov 04 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
Jun 12 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
php数组键名技巧小结
Feb 17 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 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
实现树状结构的两种方法
2006/10/09 PHP
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
php查询操作实现投票功能
2016/05/09 PHP
功能强大的php文件上传类
2016/08/29 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
python制作mysql数据迁移脚本
2019/01/01 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
django queryset相加和筛选教程
2020/05/18 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
建筑学推荐信
2013/11/03 职场文书
公司会议策划方案
2014/05/17 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS