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 条评论
登录 后参与评论

相关文章