php - ZF2 + Zend\Db\Sql\Insert + 重复 key 更新

标签 php zend-framework2 zend-db sql-insert

我想使用带有选项ON DUPLICATE KEY UPDATE的Zend\Db\Sql\Insert插入一些数据

其实我用的是这种查询:

INSERT INTO `user_data` (`user_id`, `category`, `value`) 
VALUES (12, 'cat2', 'my category value')
 ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`), `category`=VALUES(`category`), `value`=VALUES(`value`);

$this->dbAdapter->query($sql, Adapter::QUERY_MODE_EXECUTE);

但是我如何使用 Zend\Db\Sql\Insert 生成上述查询?

感谢任何建议。 干杯

最佳答案

也许这个解决方案可以帮到您。

https://gist.github.com/newage/227d7c3fb8202e473a76

/**
* Use INSERT ... ON DUPLICATE KEY UPDATE Syntax
* @since mysql 5.1
* @param array $insertData For insert array('field_name' => 'field_value')
* @param array $updateData For update array('field_name' => 'field_value_new')
* @return bool
*/
public function insertOrUpdate(array $insertData, array $updateData)
{
$sqlStringTemplate = 'INSERT INTO %s (%s) VALUES (%s) ON DUPLICATE KEY UPDATE %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 = [];
foreach ($insertData as $column => $value) {
$insertQuotedValue[] = $driver->formatParameterName($column);
$insertQuotedColumns[] = $platform->quoteIdentifier($column);
$parameterContainer->offsetSet($column, $value);
}

/* Preparation update data */
$updateQuotedValue = [];
foreach ($updateData as $column => $value) {
$updateQuotedValue[] = $platform->quoteIdentifier($column) . '=' . $driver->formatParameterName('update_' . $column);
$parameterContainer->offsetSet('update_'.$column, $value);
}

/* Preparation sql query */
$query = sprintf(
$sqlStringTemplate,
$tableName,
implode(',', $insertQuotedColumns),
implode(',', array_values($insertQuotedValue)),
implode(',', $updateQuotedValue)
);

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

关于php - ZF2 + Zend\Db\Sql\Insert + 重复 key 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004097/

相关文章:

php - 如何防止在线酒店预订中的竞争条件

php - 将新项目添加到 PHP 数组中并保存数组的先前大小

php - 超出 IP 连接限制

zend-framework - Zend 框架 1 和 2 : Get individual headMeta() values

zend-framework - Zend 框架 : How to check an additional column while using DbTable Auth Adapter?

php - 使用 Swift 在 POST 请求中将正确转义的 JSON 提交给 PHP

php - 无法将值插入到 OneToOne 关系中的 Doctrine 2 中的映射列

php - Zend Framework 2 限制 REST API 只接受 application/json 或 application/xml

mysql - 在 Zend Framework 中获取最后一个用户 ID

zend-framework - 何时使用哪个 Zend_Db 类? Zend_Db_Select 与 Zend_Db_Table_Abstract