Commit 20db85d5 authored by Alexander Butenko's avatar Alexander Butenko

Merge pull request #281 from rongzhj1990/master

Add insert on duplicate update method
parents f8d5b31e d61612df
......@@ -112,6 +112,18 @@ class MysqliDb
*/
protected $isSubQuery = false;
/**
* Name of the auto increment column
*
*/
protected $_lastInsertId = null;
/**
* Column names for update when using onDuplicate method
*
*/
protected $_updateColumns = null;
/**
* Return type: 'Array' to return results as array, 'Object' as object
* 'Json' as json string
......@@ -235,6 +247,8 @@ class MysqliDb
$this->returnType = 'Array';
$this->_nestJoin = false;
$this->_tableName = '';
$this->_lastInsertId = null;
$this->_updateColumns = null;
}
/**
......@@ -549,6 +563,19 @@ class MysqliDb
return $this;
}
/**
* This function store update column's name and column name of the
* autoincrement column
*
* @param Array Variable with values
* @param String Variable value
*/
public function onDuplicate($_updateColumns, $_lastInsertId = null)
{
$this->_lastInsertId = $_lastInsertId;
$this->_updateColumns = $_updateColumns;
}
/**
* This method allows you to specify multiple (method chaining optional) OR WHERE statements for SQL queries.
*
......@@ -778,6 +805,57 @@ class MysqliDb
return true;
}
/**
* Helper function to add variables into the query statement
*
* @param Array Variable with values
*/
protected function _buildDuplicate($tableData)
{
if (is_array($this->_updateColumns) && !empty($this->_updateColumns)) {
$this->_query .= " on duplicate key update ";
if ($this->_lastInsertId) {
$this->_lastQuery .= $this->_lastInsertId."=LAST_INSERT_ID(".$this->_lastInsertId."),";
$this->_lastInsertId = null;
}
foreach ($this->_updateColumns as $column) {
$this->_query .= "`" . $column . "` = ";
// Simple value
if (!is_array ($tableData[$column])) {
$this->_bindParam($tableData[$column]);
$this->_query .= '?, ';
continue;
}
// Function value
$arr = $tableData[$column];
$key = key($arr);
$val = $arr[$key];
switch ($key) {
case '[I]':
$this->_query .= $column . $val . ", ";
break;
case '[F]':
$this->_query .= $val[0] . ", ";
if (!empty ($val[1]))
$this->_bindParams ($val[1]);
break;
case '[N]':
if ($val == null)
$this->_query .= "!" . $column . ", ";
else
$this->_query .= "!" . $val . ", ";
break;
default:
die ("Wrong operation");
}
}
$this->_query = rtrim($this->_query, ', ');
}
}
/**
* Abstraction method that will compile the WHERE statement,
* any passed update data, and the desired rows.
......@@ -797,6 +875,7 @@ class MysqliDb
$this->_buildGroupBy();
$this->_buildOrderBy();
$this->_buildLimit ($numRows);
$this->_buildDuplicate($tableData);
$this->_lastQuery = $this->replacePlaceHolders ($this->_query, $this->_bindParams);
......
......@@ -123,6 +123,20 @@ else
echo 'insert failed: ' . $db->getLastError();
```
Insert with on duplicate key update
```php
$data = Array ("login" => "admin",
"firstName" => "John",
"lastName" => 'Doe',
"createdAt" => $db->now(),
"updatedAt" => $db->now(),
);
$updateColumns = Array ("updateAt");
$lastInsertId = "id";
$db->onDuplicate($updateColumns, $lastInsertId);
$id = $db->insert ('users', $data);
```
### Replace Query
<a href='https://dev.mysql.com/doc/refman/5.0/en/replace.html'>Replace()</a> method implements same API as insert();
......
......@@ -29,8 +29,10 @@ $tables = Array (
'lastName' => 'char(10)',
'password' => 'text not null',
'createdAt' => 'datetime',
'updatedAt' => 'datetime',
'expires' => 'datetime',
'loginCount' => 'int(10) default 0'
'loginCount' => 'int(10) default 0',
'unique key' => 'login (login)'
),
'products' => Array (
'customerId' => 'int(10) not null',
......@@ -46,6 +48,7 @@ $data = Array (
'lastName' => 'Doe',
'password' => $db->func('SHA1(?)',Array ("secretpassword+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc()
),
......@@ -55,6 +58,7 @@ $data = Array (
'lastName' => NULL,
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(2)
),
......@@ -65,6 +69,7 @@ $data = Array (
'lastName' => 'D',
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(3)
)
......@@ -136,6 +141,7 @@ $badUser = Array ('login' => null,
'lastName' => 'Doe',
'password' => 'test',
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc()
);
......@@ -170,6 +176,23 @@ if ($db->count != 3) {
exit;
}
// insert with on duplicate key update
$user = Array ('login' => 'user3',
'active' => true,
'customerId' => 11,
'firstName' => 'Pete',
'lastName' => 'D',
'password' => $db->func('SHA1(?)',Array ("secretpassword2+salt")),
'createdAt' => $db->now(),
'updatedAt' => $db->now(),
'expires' => $db->now('+1Y'),
'loginCount' => $db->inc(3)
);
$updateColumns = Array ("updatedAt");
$insertLastId = "id";
$db->onDuplicate($updateColumns, "id");
$db->insert("users", $user);
// order by field
$db->orderBy("login","asc", Array ("user3","user2","user1"));
$login = $db->getValue ("users", "login");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment