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中PDO基础教程 入门级
Sep 04 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php中return的用法实例分析
Feb 28 PHP
php自定义分页类完整实例
Dec 25 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
php实现留言板功能
Mar 05 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 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统计目录大小的自定义函数分享
2014/11/18 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
Html5 js实现手风琴效果
2020/04/17 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
Async Validator 异步验证使用说明
2017/07/03 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
Vue实现验证码功能
2019/12/03 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
介绍Python中的__future__模块
2015/04/27 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
用python写扫雷游戏实例代码分享
2018/05/27 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
小学六年级学生评语
2014/04/22 职场文书
通信工程专业求职信
2014/06/04 职场文书
出国签证在职证明
2014/09/20 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python