Skip to content

Instantly share code, notes, and snippets.

@newage
Created July 8, 2014 09:00
Show Gist options
  • Save newage/e7336d05747330b0524f to your computer and use it in GitHub Desktop.
Save newage/e7336d05747330b0524f to your computer and use it in GitHub Desktop.
MySql multi insert for ZF2
/**
* Insert many rows as one query
* @param array $data Insert array(array('field_name' => 'field_value'), array('field_name' => 'field_value_new'))
* @return bool
*/
public function multiInsert(array $data)
{
$sqlStringTemplate = 'INSERT INTO %s (%s) VALUES %s';
$adapter = $this->tableGateway->adapter; /* Get adapter from tableGateway */
$driver = $adapter->getDriver();
$platform = $adapter->getPlatform();
$tableName = $platform->quoteIdentifier('table_name');
$parameterContainer = new ParameterContainer();
$statementContainer = $adapter->createStatement();
$statementContainer->setParameterContainer($parameterContainer);
/* Preparation insert data */
$insertQuotedValue = [];
$insertQuotedColumns = [];
$i = 0;
foreach ($data as $insertData) {
$fieldName = 'field' . ++$i . '_';
$oneValueData = [];
$insertQuotedColumns = [];
foreach ($insertData as $column => $value) {
$oneValueData[] = $driver->formatParameterName($fieldName . $column);
$insertQuotedColumns[] = $platform->quoteIdentifier($column);
$parameterContainer->offsetSet($fieldName . $column, $value);
}
$insertQuotedValue[] = '(' . implode(',', $oneValueData) . ')';
}
/* Preparation sql query */
$query = sprintf(
$sqlStringTemplate,
$tableName,
implode(',', $insertQuotedColumns),
implode(',', array_values($insertQuotedValue))
);
$statementContainer->setSql($query);
return $statementContainer->execute();
}
@ijisthee
Copy link

ijisthee commented Mar 8, 2017

dear newage,

your function helped me a lot. Do you have the same for multiple update?
your other function (inserOrUpdate) only works for one row.

Thanks a lot! :))))

edit:

I have combined your multiInsert and insertOrUpdate function and it works like a charm.
Thanks a lot! :)

/**
* Insert or update many rows as one query
* @param array $data Insert array(array('field_name' => 'field_value'), array('field_name' => 'field_value_new'))
* @param array $excludedColumns For excluding update columns array('field_name1', 'field_name2')
* @return bool
*/

`public function multiInsertOrUpdate(array $data, array $excludedColumns)
{
    $sqlStringTemplate = 'INSERT INTO %s (%s) VALUES %s ON DUPLICATE KEY UPDATE %s';
    $adapter = $this->dbAdapter; /* Get adapter from tableGateway */
    $driver = $adapter->getDriver();
    $platform = $adapter->getPlatform();

    $tableName = $this->table;
    $parameterContainer = new \Zend\Db\Adapter\ParameterContainer();
    $statementContainer = $adapter->createStatement();
    $statementContainer->setParameterContainer($parameterContainer);

    /* add columns they should be updated */
    foreach ($data[0] as $column => $value) {
        if (false === array_search($column, $excludedColumns))
        {
            $updateQuotedValue[] = ($platform->quoteIdentifier($column)) . '=' . ('VALUES(' . ($platform->quoteIdentifier($column)) . ')');
        }
    }

    /* Preparation insert data */
    $insertQuotedValue = [];
    $insertQuotedColumns = [];
    $i = 0;
    foreach ($data as $insertData) {
        $fieldName = 'field' . ++$i . '_';
        $oneValueData = [];
        $insertQuotedColumns = [];
        foreach ($insertData as $column => $value) {
            $oneValueData[] = $driver->formatParameterName($fieldName . $column);
            $insertQuotedColumns[] = $platform->quoteIdentifier($column);
            $parameterContainer->offsetSet($fieldName . $column, $value);
        }
        $insertQuotedValue[] = '(' . implode(',', $oneValueData) . ')';
    }
    
    /* Preparation sql query */
    $query = sprintf(
        $sqlStringTemplate,
        $tableName,
        implode(',', $insertQuotedColumns),
        implode(',', array_values($insertQuotedValue)),
        implode(',', array_values($updateQuotedValue))
    );

    $statementContainer->setSql($query);
    return $statementContainer->execute();

}`

@Canavell
Copy link

dear newage,

your function helped me a lot. Do you have the same for multiple update?
your other function (inserOrUpdate) only works for one row.

Thanks a lot! :))))

edit:

I have combined your multiInsert and insertOrUpdate function and it works like a charm.
Thanks a lot! :)

/**

  • Insert or update many rows as one query
  • @param array $data Insert array(array('field_name' => 'field_value'), array('field_name' => 'field_value_new'))
  • @param array $excludedColumns For excluding update columns array('field_name1', 'field_name2')
  • @return bool
    */
`public function multiInsertOrUpdate(array $data, array $excludedColumns)
{
    $sqlStringTemplate = 'INSERT INTO %s (%s) VALUES %s ON DUPLICATE KEY UPDATE %s';
    $adapter = $this->dbAdapter; /* Get adapter from tableGateway */
    $driver = $adapter->getDriver();
    $platform = $adapter->getPlatform();

    $tableName = $this->table;
    $parameterContainer = new \Zend\Db\Adapter\ParameterContainer();
    $statementContainer = $adapter->createStatement();
    $statementContainer->setParameterContainer($parameterContainer);

    /* add columns they should be updated */
    foreach ($data[0] as $column => $value) {
        if (false === array_search($column, $excludedColumns))
        {
            $updateQuotedValue[] = ($platform->quoteIdentifier($column)) . '=' . ('VALUES(' . ($platform->quoteIdentifier($column)) . ')');
        }
    }

    /* Preparation insert data */
    $insertQuotedValue = [];
    $insertQuotedColumns = [];
    $i = 0;
    foreach ($data as $insertData) {
        $fieldName = 'field' . ++$i . '_';
        $oneValueData = [];
        $insertQuotedColumns = [];
        foreach ($insertData as $column => $value) {
            $oneValueData[] = $driver->formatParameterName($fieldName . $column);
            $insertQuotedColumns[] = $platform->quoteIdentifier($column);
            $parameterContainer->offsetSet($fieldName . $column, $value);
        }
        $insertQuotedValue[] = '(' . implode(',', $oneValueData) . ')';
    }
    
    /* Preparation sql query */
    $query = sprintf(
        $sqlStringTemplate,
        $tableName,
        implode(',', $insertQuotedColumns),
        implode(',', array_values($insertQuotedValue)),
        implode(',', array_values($updateQuotedValue))
    );

    $statementContainer->setSql($query);
    return $statementContainer->execute();

}`

Thank you so much! Very useful and helpful!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment