11

関連するフィールドのカウンターをインクリメントするcacheCounterinを使用しています。CakePHP

例として、Person テーブルと Source テーブルがあります。Person.source_id は、ソース テーブルの行にマップされます。各人物には 1 つの Source があり、各 Source には Person 行がないか、多数あります。

cacheCounter人のソースの値を変更するとうまくいきます。増加しますSource.Person_Count。涼しい。

ただし、増分すると、人の宛先ソースに追加されますが、古い値からは削除されません。で試してみupdateCacheControl()ましたafterSaveが、何もしませんでした。

そこでafterSave、ソースの source_id を差し引くためのコードをモデルに書きましたが、source_id. (そのため、カウントはマイナスになりました)。

私の質問: のモデルでフィールドが変更されたかどうかを確認する方法はありCakePHPますか?

4

7 に答える 7

17

フィールドの変更を監視するには、モデルでこのロジックを使用できます。他の場所を変更する必要はありません。

function beforeSave() {
    $this->recursive = -1;
    $this->old = $this->find(array($this->primaryKey => $this->id));
    if ($this->old){
        $changed_fields = array();
        foreach ($this->data[$this->alias] as $key =>$value) {
            if ($this->old[$this->alias][$key] != $value) {
                $changed_fields[] = $key;
            }
        }
    }
    // $changed_fields is an array of fields that changed
    return true;
}
于 2008-09-26T10:04:22.300 に答える
8

Alexander Morland Answerを参照してください。

フィルターの前にループする代わりに、これはどうですか。

$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]);

キーと値も取得します。

于 2012-08-24T05:38:50.330 に答える
0

編集はめったに行われないため、更新を行う前に別の選択を行うことは大したことではないため、保存する前にレコードを取得して保存し、編集フォームで送信されたデータを、保存する前にデータベースから取得したデータと比較します。違う場合は、何かをしてください。

于 2008-09-23T19:52:31.210 に答える
0

編集ビューで、監視するフィールドに別の非表示フィールドを含めますが、フィールド名に「_prev」などの接尾辞を付けて、監視するフィールドの現在の値に値を設定します。次に、コントローラーの編集アクションで、2 つのフィールドが等しくない場合に何らかの処理を行います。例えば

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));
于 2008-09-23T20:02:03.807 に答える
-1

「保存」が「影響を受けた行」を返すある種のDBAL呼び出しを使用しているかどうかを確認してください。通常、これは最後のクエリがデータを変更したかどうか、または変更しなかったかどうかを判断する方法です。そうでない場合、UPDATE ステートメントの後の影響を受ける行は 0 になるためです。

于 2008-09-23T09:15:55.733 に答える
-1

任意のモデル クラスで getAffectedRows() を呼び出すことができます。

クラス Model から:

/**
 * Returns the number of rows affected by the last query
 *
 * @return int Number of rows
 * @access public
 */
    function getAffectedRows() {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        return $db->lastAffected();
    }
于 2011-09-13T20:49:10.513 に答える