我的模型有2个唯一索引。主键和字母数字ID。
我在更新所述记录时只有字母数字id,所以我需要在save函数中添加“on duplicate key update”语句,但是我该怎么做?
我不想先查询主键,因为这会使导入过程变得非常漫长和缓慢。
答案 0 :(得分:3)
另一种选择是覆盖模型中的Model->exists()
。这实际上和Cake一样,但扩展到其他键不仅是primaryKey。
/**
* Overrides Model->exists() method so we can check for uniqueness if primary key is not set
*
* If a record already exists, sets the primary key of that record to do an update
*
* @param int $id
* @return bool True if the record exists, false otherwise
*/
public function exists($id = null)
{
if (empty($id) && !$this->getID() && isset($this->data[$this->alias]) && is_array($this->data[$this->alias])) {
// given $id and primary key are empty, try with data
$exists = $this->find('first', array(
'fields' => array($this->primaryKey),
'conditions' => array(
'key1'=>$this->data[$this->alias]['key1'],
'key2'=>$this->data[$this->alias]['key2'],
),
'recursive' => -1,
'callbacks' => false,
));
if ($exists) {
$this->set($this->primaryKey, $exists[$this->alias][$this->primaryKey]);
return true;
}
}
return parent::exists($id);
}
答案 1 :(得分:2)
cakephp中没有支持'重复密钥更新'选项。
如果你真的不想进行查找,我建议将字母数字id更改为主键(只要它类似于UUID而不是varchar)。如果这不是一个选项,我最好的建议是添加一个执行完整性检查的beforeSave方法。
这是一个可以帮助Cakephp check if record exists
的链接