في CakePHP، كيف يمكنك تحديد ما إذا كان الحقل قد تم تغييره في عملية التحرير؟

StackOverflow https://stackoverflow.com/questions/115665

  •  02-07-2019
  •  | 
  •  

سؤال

أنا أستخدم cacheCounter في CakePHP, ، مما يؤدي إلى زيادة عداد الحقول ذات الصلة.

على سبيل المثال، لدي جدول "شخص" وجدول "مصدر".يقوم Person.source_id بتعيين صف في الجدول المصدر.كل شخص لديه مصدر واحد، وكل مصدر لا يحتوي على أي صفوف أشخاص أو يحتوي على العديد من صفوف الأشخاص.

cacheCounter يعمل بشكل رائع عندما أقوم بتغيير قيمة المصدر لشخص ما.فإنه يزيد Source.Person_Count.رائع.

ولكن عند زيادتها، فإنها تضيفها إلى مصدر الوجهة لشخص ما، ولكنها لا تزيلها من القيمة القديمة.حاولت updateCacheControl() في afterSave, ، لكن ذلك لم يفعل شيئًا.

لذا كتبت بعض التعليمات البرمجية في النموذج الخاص بي لـ afterSave من شأنه أن يطرح مصدر source_id، لكنه كان يفعل ذلك دائمًا حتى عندما لم أكن أغير حتى source_id.(وبالتالي أصبح العد سلبيا).

سؤالي:هل هناك طريقة لمعرفة ما إذا كان قد تم تغيير حقل في النموذج في CakePHP?

هل كانت مفيدة؟

المحلول

لمراقبة التغييرات في أحد الحقول، يمكنك استخدام هذا المنطق في النموذج الخاص بك دون الحاجة إلى إجراء تغييرات في أي مكان آخر:

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;
}

نصائح أخرى

بالاستناد الى ألكسندر مورلاند إجابة.

ماذا عن هذا بدلاً من تكراره قبل التصفية.

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

سوف تحصل على المفتاح وكذلك القيمة أيضًا.

في طريقة عرض التحرير، قم بتضمين حقل مخفي آخر للحقل الذي تريد مراقبته ولكن قم بإلحاق اسم الحقل بشيء مثل "_prev" وقم بتعيين القيمة على القيمة الحالية للحقل الذي تريد مراقبته.ثم في إجراء التحرير الخاص بوحدة التحكم الخاصة بك، افعل شيئًا إذا كان الحقلان غير متساويين.على سبيل المثال

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));

تحدث التعديلات بشكل غير متكرر، لذا فإن التحديد مرة أخرى قبل إجراء التحديث ليس مشكلة كبيرة، لذا، قم بإحضار السجل قبل حفظه، وحفظه، ومقارنة البيانات المقدمة في نموذج التحرير مع البيانات التي جلبتها من قاعدة البيانات قبل حفظها، إذا كان الأمر مختلفًا، فافعل شيئًا.

معرفة ما إذا كان "الحفظ" يستخدم نوعًا من استدعاء DBAL الذي يُرجع "الصفوف المتأثرة"، عادةً ما تكون هذه هي الطريقة التي يمكنك من خلالها الحكم على ما إذا كان الاستعلام الأخير قد غيّر البيانات، أو إذا لم يحدث ذلك.لأنه إذا لم يحدث ذلك، فإن الصفوف المتأثرة بعد عبارة UPDATE هي 0.

يمكنك استدعاء getAffectedRows() على أي فئة نموذج.

من نموذج الصف :

/**
 * 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();
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top