yii2覆盖数据库类中的batchinsert

鲁本

我想覆盖batchinsert,因为我想添加 ON DUPLICATE KEY UPDATE

$result = Yii::$app->db->createCommand()->batchInsert('product', ['asin', 'title', 'image', 'url', 'price'], $results)->execute();


public function batchInsert($table, $columns, $rows)
{

    if (empty($rows)) {
        return '';
    }

    $schema = $this->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]]) && !is_array($value)) {
                $value = $columnSchemas[$columns[$i]]->dbTypecast($value);
            }
            if (is_string($value)) {
                $value = $schema->quoteValue($value);
            } elseif ($value === false) {
                $value = 0;
            } elseif ($value === null) {
                $value = 'NULL';
            }
            $vs[] = $value;
        }
        $values[] = '(' . implode(', ', $vs) . ')';
    }

    $query = 'INSERT INTO ' . $schema->quoteTableName($table);
    $duplicate = ' ON DUPLICATE KEY UPDATE ';

    $last = end($columns);
    reset($columns);

    foreach ($columns as $i => $name) {
        $columns[$i] = $schema->quoteColumnName($name);
        $duplicate .= $schema->quoteColumnName($name) . ' = VALUES(' . $schema->quoteColumnName($name) . ')';

        if ($name <> $last) {
            $duplicate .= ', ';
        }
    }

    $query .= ' (' . implode(', ', $columns) . ') ';
    $query .= ' VALUES ' . implode(', ', $values);
    $query .= $duplicate;

    return $query;
}

这是可行的,但是现在我需要重写yii \ db \ QueryBuilder。 Yii::$app->db->commandClass = new common\models\Command();

并且我可以覆盖命令类,但是yii \ db \ Schema中的代码也应该更新

public function createQueryBuilder()
{
    return new \common\models\QueryBuilder($this->db);
}

还是我需要做一些完全不同的事情,该如何解决?

开膛手

根据对开发人员的非标准sql命令讨论,您可以执行以下操作(未经测试):

class MyQueryBuilder extends yii\db\mysql\QueryBuilder
{
    public function batchInsert($table, $columns, $rows)
    {
        $sql = parent::batchInsert($table, $columns, $rows);
        $sql .= 'ON DUPLICATE KEY UPDATE';
        return $sql;
    }
}

或者您可以执行以下操作:

$db = Yii::$app->db;
$sql = $db->queryBuilder->batchInsert($table, $fields, $rows);
$db->createCommand($sql . ' ON DUPLICATE KEY UPDATE')->execute();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Yii2中的数据库版本检查

来自分类Dev

在yii2中插入数据库吗?

来自分类Dev

yii2从数据库登录

来自分类Dev

文件上传操作期间,将数据保存在yii2中的数据库中

来自分类Dev

在文件上载操作期间将数据保存在yii2中的数据库中

来自分类Dev

Yii2在不使用GridView的情况下显示数据库中的数据

来自分类Dev

Yii2表单提交数据值未保存在数据库中

来自分类Dev

无法将数据csv导入yii2中的数据库

来自分类Dev

yii2为什么我不能在数据库中存储数据?

来自分类Dev

Yii2中数据库的特定数据量

来自分类Dev

Yii2 如何将接收到的 JSON 数据保存到数据库中

来自分类Dev

在Yii2中从数据库中多态查找模型

来自分类Dev

如何在Yii2中比较数据库中的日期

来自分类Dev

根据yii2中数据库中的字段显示Gridview

来自分类Dev

将文本保存在 yii2 中的数据库中

来自分类Dev

Yii2 db getStats(数据库查询数)

来自分类Dev

Yii2数据库架构最佳实践

来自分类Dev

yii2上的多个数据库连接

来自分类Dev

Yii2将模型保存到数据库

来自分类Dev

Yii2创建数据库连接

来自分类Dev

Yii2将模型保存到数据库

来自分类Dev

Yii2创建数据库连接

来自分类Dev

Yii2内爆来自数据库的查询

来自分类Dev

yii2检查数据库类型(mysql或oracle)

来自分类Dev

Yii2 迁移无法创建数据库

来自分类Dev

如何从 Yii2 连接到 RDS 数据库?

来自分类Dev

Yii2 问题以获取数据库查询的结果

来自分类Dev

Yii2会话存储在数据库中,行太多了吗?表现?

来自分类Dev

Yii2显示存储在BLOB数据库字段中的图像