在CakePHP中保存记录时使用'on duplicate key update'

时间:2012-11-15 11:07:22

标签: cakephp cakephp-2.1

我的模型有2个唯一索引。主键和字母数字ID。

我在更新所述记录时只有字母数字id,所以我需要在save函数中添加“on duplicate key update”语句,但是我该怎么做?

我不想先查询主键,因为这会使导入过程变得非常漫长和缓慢。

2 个答案:

答案 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

的链接