簡體   English   中英

yii2 覆蓋數據庫類中的批處理插入

[英]yii2 override batchinsert from database class

我想覆蓋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();
<?php

namespace common\models;

use yii\db\mysql\QueryBuilder as baseQueryBuilder;

class QueryBuilder extends baseQueryBuilder
{
    public function batchInsert($table, $columns, $rows)
    {
        $sql = parent::batchInsert($table, $columns, $rows);
        $sql .= ' ON DUPLICATE KEY UPDATE ';

        $schema = $this->db->getSchema();
        $last = end($columns);
        reset($columns);

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

            if ($column <> $last) {
                $sql .= ', ';
            }
        }

        return $sql;
    }
}


$db = Yii::$app->db;
$queryBuilder = new \common\models\QueryBuilder(Yii::$app->db);
$query = $queryBuilder->batchInsert('product', ['asin', 'title', 'image', 'url', 'price'], $results);
$db->createCommand($query)->execute();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM