Cakephp Habtm: تحرير عنصر واحد يتسع HABTM ROW للحصول على إعادة إنشاء ، يدمر بيانات إضافية

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

سؤال

أواجه مشكلة في علاقتي HABTM في CakePhP.

لدي نموذجان مثل ذلك: Department habtm Location. شركة واحدة كبيرة لديها العديد من المباني ، ويوفر كل مبنى عددًا محدودًا من الخدمات. يحتوي كل مبنى أيضًا على صفحة ويب خاصة به ، لذلك بالإضافة إلى علاقة HABTM نفسها ، يحتوي كل صف HABTM أيضًا url الحقل حيث يمكن للمستخدم زيارة لإيجاد معلومات إضافية حول الخدمة التي يهتمون بها وكيفية عملها في المبنى الذي يهتمون به.

لقد قمت بإعداد النماذج مثل ذلك:

<?php
class Location extends AppModel {
    var $name = 'Location';

    var $hasAndBelongsToMany = array(
        'Department' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>


<?php
class Department extends AppModel {
    var $name = 'Department';

    var $hasAndBelongsToMany = array(
        'Location' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>

<?php
class DepartmentsLocation extends AppModel {
    var $name = 'DepartmentsLocation';

    var $belongsTo = array(
        'Department',
        'Location'
    );    


    // I'm pretty sure this method is unrelated. It's not being called when this error
    // occurs. Its purpose is to prevent having two HABTM rows with the same location
    // and department.
    function beforeSave() {

        // kill any existing rows with same associations
        $this->log(__FILE__ . ": killing existing HABTM rows", LOG_DEBUG);

        $result = $this->find('all', array("conditions" =>
            array("location_id" => $this->data['DepartmentsLocation']['location_id'],
                  "department_id" => $this->data['DepartmentsLocation']['department_id'])));


        foreach($result as $row) { 
            $this->delete($row['DepartmentsLocation']['id']);
        }

        return true;
    }
}
?>

وحدات التحكم غير مهتم تمامًا.

المشكلة:إذا قمت بتحرير اسم أ Location, ، جميع ال DepartmentsLocationS التي كانت مرتبطة بذلك Location يتم إعادة إنشاء بعنوان URL فارغ. نظرًا لأن النماذج تحدد أن فريدة من نوعها صحيحة ، فإن هذا يتسبب أيضًا في كتابة جميع الصفوف الأحدث في الكتابة فوق الصفوف القديمة ، والتي تدمر جميع عناوين URL بشكل أساسي.

أود أن أعرف شيئين: هل يمكنني إيقاف هذا؟ إذا كان الأمر كذلك ، كيف؟

وعلى ملاحظة أقل تقنية وأكثر من ذلك: لماذا يحدث هذا حتى؟ يبدو لي غريبًا بالنسبة لي أن تحرير حقل عبر الكعكة يجب أن يسبب الكثير من المتاعب ، عندما أتمكن بسهولة من المرور عبر phpmyadmin Location اسم هناك ، واحصل على النتيجة بالضبط التي أتوقعها. لماذا يلمس Cakephp بيانات HABTM عندما أقوم فقط بتحرير حقل على صف واحد؟ إنه ليس حتى مفتاح خارجي!

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

المحلول

من كتاب الطبخ ، المشكلة الأولى هي:

افتراضيًا عند حفظ علاقة Hasandbelongstomany ، ستحذف Cake جميع الصفوف على طاولة الانضمام قبل حفظ صفوف جديدة.

لست متأكدًا تمامًا من سبب محاولة Cake حفظ بيانات HABTM على الرغم من أنه ليس لديك مفتاح خارجي في بياناتك ، ولكن هناك حل سهل لذلك. ببساطة تدمير الجمعية لاستدعاء حفظ:

$this->Location->unbindModel(
    array('hasAndBelongsToMany' => array('Department'))
);

نصائح أخرى

أفكر في أحد أسباب حدوث ذلك. عندما تسترجع Location, ، يمكنك أيضا استرداد locations_departments البيانات. وعندما تفعل save($this->data) إنه يبحث عن نماذج في الصفيف وينقذها.

طريقة لحل هذا هو تعيين recursive ميزة (من نموذج) إلى -1 أو 0 (حاول ، لست متأكدًا ، فقط قم بطباعة البيانات لمعرفة ما يظهر). يمكنك ضبطه في النموذج: var $recursive = -1; أو في طريقة وحدة التحكم (العمل): $this->ModelName->recursive = -1;

المزيد عن العودية: http://book.cakephp.org/view/439/recursive

إنه يشبه حقًا ماذا Harpax مقترح ، فقط إذا لم تكن بحاجة إلى هذه البيانات ، أخبرها بالكعك ، حتى لا تجلبها.

المشكلة هي أنه عند حفظك Location, ، أعطيت طريقة حفظ مجموعة تحتوي على كل DepartmentsLocations جدا. وهكذا يدمر Cakephp كل شيء ويحاول إعادة إنشائه.

هذا خطأ شائع مع الكعكة لأنه غالبًا ما يسحب الكثير من النتائج بالنسبة لك.

تأكد من تمرير البيانات فقط التي يجب حفظها ، أو من الأفضل إحضار البيانات التي تحتاجها فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top