6

私のモデルには2つの一意のインデックスがあります。主キーと英数字のID。

上記のレコードを更新するときは英数字のIDしかないので、「重複キーの更新時」ステートメントを保存関数に追加する必要がありますが、どうすればよいですか?

また、最初に主キーを照会したくないのは、インポートプロセスが非常に長く、遅くなるためです。

4

2 に答える 2

3

もう1つのオプションは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);
}
于 2014-07-24T08:31:16.930 に答える
2

Cakephpには「重複キー更新」オプションはサポートされていません。

本当にルックアップを実行したくない場合は、英数字IDを主キーに変更することをお勧めします(それがUUIDのようなものであり、varcharではない場合)。それがオプションでない場合、私の最善のアドバイスは、整合性チェックを行うbeforeSaveメソッドを追加することです。

Cakephpがレコードが存在するかどうかを確認するのに役立つリンクは次のとおりです

于 2013-01-16T20:29:17.513 に答える