【问题标题】:yii2 override batchinsert from database classyii2 从数据库类中覆盖 batchinsert
【发布时间】:2017-01-30 00:46:12
【问题描述】:

我要覆盖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-&gt;db-&gt;commandClass = new common\models\Command();

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

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

或者我需要做一些完全不同的事情,我该如何解决这个问题?

【问题讨论】:

    标签: php mysql yii2


    【解决方案1】:

    根据this discussion about non standard sql commands 的开发人员,您可以执行以下操作(未经测试):

    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();
    

    【讨论】:

    • 谢谢,如果没有 asin = VALUES ( asin )、title = VALUES(title) 等,ON DUPLICATE KEY UPDATE 对我不起作用,但它现在可以工作了
    【解决方案2】:
    <?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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多