Check this article Yii INSERT ... ON DUPLICATE UPDATE. They suggest you don't use this feature. But i want it to use, so I extended from CDbCommand my own component and add method for ON DUPLICATE KEY UPDATE:
public function insertDuplicate($table, $columns, $duplicates)
{
$params=array();
$names=array();
$placeholders=array();
foreach($columns as $name=>$value)
{
$names[]=$this->getConnection()->quoteColumnName($name);
if($value instanceof CDbExpression)
{
$placeholders[] = $value->expression;
foreach($value->params as $n => $v)
$params[$n] = $v;
}
else
{
$placeholders[] = ':' . $name;
$params[':' . $name] = $value;
}
}
$d = array();
foreach($duplicates as $duplicate)
{
$d[] = '`' . $duplicate . '` = VALUES(`'.$duplicate.'`)';
}
$sql='INSERT INTO ' . $this->getConnection()->quoteTableName($table)
. ' (' . implode(', ',$names) . ') VALUES ('
. implode(', ', $placeholders) . ') ON DUPLICATE KEY UPDATE ' . implode(', ', $d);
return $this->setText($sql)->execute($params);
}
Usage example:
Yii::app()->db->createCommand()->insertDuplicate('user', [
'id' => $this->id,
'token' => $token,
'updated' => date("Y-m-d H:i:s"),
], ['token', 'updated']);
This command will create user with this parameters or update token
and updated
fields if record exists.