检查这篇文章Yii 插入...重复更新 https://stackoverflow.com/questions/9004269/yii-insert-on-duplicate-update。他们建议您不要使用此功能。但我希望它能够使用,所以我从 CDbCommand 扩展了我自己的组件,并添加了 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);
}
使用示例:
Yii::app()->db->createCommand()->insertDuplicate('user', [
'id' => $this->id,
'token' => $token,
'updated' => date("Y-m-d H:i:s"),
], ['token', 'updated']);
此命令将使用此参数创建用户或更新token
and updated
如果记录存在则字段。