<?php
/**
* Created by PhpStorm.
* User: yufen
* Date: 2018/8/31
* Time: 9:54
*/ namespace app\base; use yii\db\ExpressionInterface;
use Yii; trait DB
{
private static function changeFormat($val)
{
$db = Yii::$app->db;
if (is_string($val)) {
$val = $db->quoteValue($val);
} elseif (is_float($val)) {
$val = \yii\helpers\StringHelper::floatToString($val);
} elseif ($val === false) {
$val = 0;
} elseif ($val === null) {
$val = 'NULL';
}
return $val;
} private static function batchUpsertColumns($table, $columns, $rows, $updateColumns)
{
if (empty($rows)) {
return '';
}
$db = Yii::$app->db;
$schema = $db->getSchema();
if (($tableSchema = $schema->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = [];
} $values = [];
foreach ($rows as $row) {
$vs = [];
foreach ($row as $i => $value) {
if (isset($columns[$i], $columnSchemas[$columns[$i]])) {
$value = $columnSchemas[$columns[$i]]->dbTypecast($value);
}
$value = self::changeFormat($value);
$vs[] = $value;
}
$values[] = '(' . implode(', ', $vs) . ')';
} if (empty($values)) {
return '';
}
foreach ($columns as $i => $name) {
$columns[$i] = $schema->quoteColumnName($name);
}
$sql = sprintf('INSERT INTO %s %s VALUES %s', $schema->quoteTableName($table), '(' . implode(',', $columns) . ')', implode(', ', $values));
if (!is_array($updateColumns) || empty($updateColumns)) {
return $sql;
}
$sets = [];
foreach ($updateColumns as $key => $val) {
$val = isset($columnSchemas[$key]) ? $columnSchemas[$key]->dbTypecast($val) : $val;
if ($val instanceof ExpressionInterface) {
$placeholder = $db->getQueryBuilder()->buildExpression($val);
} else if (is_numeric($val)) {
$placeholder = is_float($val) ? \yii\helpers\StringHelper::floatToString($val) : $val;
} else {
$placeholder = $db->quoteValue($val);
}
$sets[] = $db->quoteColumnName($key) . '=' . $placeholder;
}
return $sql . ' ON DUPLICATE KEY UPDATE ' . implode(', ', $sets);
} private static function batchUpdateColumns($table, $columns, $condition, &$params)
{
if (empty($columns)) {
return '';
}
$db = Yii::$app->db;
$schema = $db->getSchema();
if (($tableSchema = $schema->getTableSchema($table)) !== null) {
$columnSchemas = $tableSchema->columns;
} else {
$columnSchemas = [];
}
$value = [];
foreach ($columns as $rows) {
$name = $rows['name'];
$target = $rows['target'];
$vs = [];
foreach ($rows['data'] as $key => $val) {
$val = isset($columnSchemas[$name]) ? $columnSchemas[$name]->dbTypecast($val) : $val;
$key = isset($columnSchemas[$target]) ? $columnSchemas[$target]->dbTypecast($key) : $key;
$key = self::changeFormat($key);
if ($val instanceof ExpressionInterface) {
$val = $db->getQueryBuilder()->buildExpression($val, $params);
} else {
$val = $db->getQueryBuilder()->bindParam($val, $params);
}
$vs[] = ' WHEN ' . $key . ' THEN ' . $val;
}
$value[] = $schema->quoteColumnName($name) . '= CASE ' . $schema->quoteColumnName($target) . implode('', $vs) . ' END ';
}
$sql = sprintf('UPDATE %s SET %s', $schema->quoteTableName($table), implode(',', $value));
$where = $db->getQueryBuilder()->buildWhere($condition, $params);
return $where === '' ? $sql : $sql . ' ' . $where;
} /**upsert的拓展,批量操作
* eg:
* $res = self::batchUpsert('table', ['cid', 'goods', 'created'], [
* [1, 'test1', time()],
* [2, 'test2', time()]
* ], [
* 'goods' => new Expression('VALUES(goods)'),
* 'created'=>time()
* ]);
*
* @param $table
* @param $columns
* @param $rows
* @param $updateColumns
* @return int
*/
public static function batchUpsert($table, $columns, $rows, $updateColumns)
{
$db = Yii::$app->db;
$table = $db->quoteSql($table);
$sql = self::batchUpsertColumns($table, $columns, $rows, $updateColumns);
return $db->createCommand()->setRawSql($sql)->execute();
} /**批量更改
* eg
*self::batchUpdate('shop', [
* ['name'=>'goods','target'=>'tid','data'=>['1'=>'认真的么','2'=>'你是认真的么','3'=>'你确定你是认真的么???']],
* ['name'=>'created','target'=>'tid','data'=>['1'=>$_SERVER['REQUEST_TIME'],'2'=>$_SERVER['REQUEST_TIME'],'3'=>$_SERVER['REQUEST_TIME']]]
* ],['in','tid',[1,2,3]]);
* @param $table
* @param $rows
* @param string $condition
* @param array $params
* @return int
*/
public static function batchUpdate($table, $rows, $condition = '', $params = [])
{
$db = Yii::$app->db;
$table = $db->quoteSql($table);
$sql = self::batchUpdateColumns($table, $rows, $condition, $params);
return $db->createCommand()->setRawSql($sql)->bindValues($params)->execute();
}
}

以上的类通过自封装的batchUpsert,batchUpdate,是在YII环境下封装的

batchUpsert的运用方法如下

$res = self::batchUpsert('shop', ['cid', 'goods', 'created'], [
[1, 'text1', time()],
[2, 'text1', time()],
[3, 'text1', time()]
], [
'goods' => new Expression('VALUES(goods)'),
'created' => $_SERVER['REQUEST_TIME']
]);

batchUpdate的运用方法如下

self::batchUpdate('shop', [
['name'=>'goods','target'=>'tid','data'=>['1'=>'认真的么','2'=>'你是认真的么','3'=>'你确定你是认真的么???']],
['name'=>'created','target'=>'tid','data'=>['1'=>$_SERVER['REQUEST_TIME'],'2'=>$_SERVER['REQUEST_TIME'],'3'=>$_SERVER['REQUEST_TIME']]]
],['in','tid',[1,2,3]]);

YII 自封装的批量修改的mysql操作类的更多相关文章

  1. ArcGIS模型构建器案例教程-批量修改工作空间所有要素类的空间参考

    ArcGIS模型构建器案例教程-批量修改工作空间所有要素类的空间参考 目的:批量修改工作空间所有要素类的空间参考(坐标系) 工具名称:WorkspaceChangeSpatialReference 使 ...

  2. IDEA批量修改变量名操作

    批量修改变量名操作:shift+F6选中变量---->修改变量---->Enter回车

  3. php--->单例模式封装mysql操作类

    php 单例模式封装mysql操作类 单例模式的必要条件(三私一公) 私有的成员属性--防止类外引入这个存放对象的属性 私有的构造方法--为了防止在类外使用new关键字实例化对象 私有的克隆方法--为 ...

  4. ecshop的Mysql操作类

    摘要,这是直接摘抄的ecshop的mysql操作类:不过他这里的缓存是用的文件缓存,我们如果想直接使用,可以替换成memcache的或者redis的! <?php /** * ECSHOP MY ...

  5. PHP:自己写的mysql操作类

    a{ font-weight: bold; display: block; text-align: center; color: #5887bf; font-size: 22px; } .conten ...

  6. Angular4+NodeJs+MySQL 入门-02 MySql操作类

    NodeJs操作MySQL类 此类封装了几个常用的方法:插入,更新,删除,查询,开启事务,事务提交,事务回滚等操作.有一这个类,操作MYSQL就方便多了. 批处理,存储过程等方法还没有添加,因为觉得目 ...

  7. sqlmap动态sql优化,避免传参失误批量修改和删除操作!

    分析以下的sqlmap存在问题: <delete id="deletePartspic" parameterClass="TblSpPartspic"&g ...

  8. MySQL操作类的封装(PHP)

    <?php class mysql{ /** * 报错函数 * * @param string $error */ function err($error){ die("对不起,您的操 ...

  9. PHP封装的一个单例模式Mysql操作类

    掌握满足单例模式的必要条件----三私一公. ①私有的构造方法-为了防止在类外使用new关键字实例化对象. ②私有的成员属性-为了防止在类外引入这个存放对象的属性. ③私有的克隆方法-为了防止在类外通 ...

随机推荐

  1. LODOP中的纯文本和超文本打印项

    LODOP中的的打印项,有超文本也有纯文本,超文本指的是用html语言,html里的标签为值的打印项,该种打印项会经过浏览器解析,LODOP本身不带解析超文本的引擎,调用的windows底层引擎,与i ...

  2. linux 实现centos7在线升级最新版本内核

    Kernel  (内核)是操作系统的核心,掌握所有硬件设备的控制权,也就是说,你所希望计算机帮你完成的各项工作,都需要通过内核的帮助才能完成,当然,如果我们想完成的某个功能是内核没有的,则内核不会操控 ...

  3. codeforces479E

    Riding in a Lift CodeForces - 479E Imagine that you are in a building that has exactly n floors. You ...

  4. jap篇 之 JSTL标签库

    JSTL标签库: JSTL: JSP Standard Tag Library 作用:和[EL配合]使用,可以让用户[尽可能少的使用java源码]. 1,导入jar包 导入(复制粘贴到项目中的lib目 ...

  5. TP5.x——多数据库连接查询

    前言 需要到不同的数据库获取不同的表,看了下文档发现有这类方法,就记录下 文档 https://www.kancloud.cn/manual/thinkphp5_1/353998 步骤 配置文件 re ...

  6. 【转】如何在 GitHub 上找到你要的代码?

    [来源]

  7. JDK源码分析(7)String

    String String表示字符串,Java中所有字符串的字面值都是String类的实例,例如"ABC".字符串是常量,在定义后不能被改变,字符串缓冲区支持可变的字符串.因为St ...

  8. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

  9. [BJOI2019]勘破神机(斯特林数+二项式定理+数学)

    题意:f[i],g[i]分别表示用1*2的骨牌铺2*n和3*n网格的方案数,求ΣC(f(i),k)和ΣC(g(i),k),对998244353取模,其中l<=i<=r,1<=l< ...

  10. Luogu P3227 [HNOI2013]切糕 最小割

    首先推荐一个写的很好的题解,个人水平有限只能写流水账,还请见谅. 经典的最小割模型,很多人都说这个题是水题,但我还是被卡了=_= 技巧:加边表示限制 在没有距离\(<=d\)的限制时候,我们对每 ...