1

我在CakePHP中遇到了我的HABTM關係問題。CakePHP HABTM:編輯一個項目會導致HABTM行重新創建,破壞額外的數據

我有兩個這樣的模型: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的名字,都被鏈接到LocationDepartmentsLocation S的空網址重新創建。由於模型指定唯一性爲真,這也會導致所有較新的行覆蓋舊行,這實質上會破壞所有的URL。

我想知道兩件事: 我可以阻止它嗎?如果是這樣,怎麼樣?

而且,在一個技術性較低,更wh note的筆記上:爲什麼會發生這種情況?在我看來,通過Cake編輯字段應該會造成很多麻煩,當我可以輕鬆地通過phpMyAdmin,在那裏編輯Location名稱,並獲得我期望的結果。爲什麼CakePHP只在一行中編輯字段時觸及HABTM數據?它甚至不是外鍵!

+0

注'「獨特」 =>「keepExisting''在各國無法重新創建現有HABTM項目HABTM定義選項。這是很好的,如果你真的想要* *保存新的關係,但又不想失去更多的數據。 – Yogu 2013-05-05 18:52:17

回答

1

從食譜第一問題是:

默認保存 HasAndBelongsToMany關係時,蛋糕 將保存新的之前刪除的連接表 所有行。

我不太確定Cake爲什麼要保存HABTM數據,即使您的數據中沒有外鍵,但有一個簡單的解決方案。只要destroy the association爲節省撥打:

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

我想到的一個原因這可能發生。當您檢索Location時,還會檢索locations_departments數據。當您執行save($this->data)時,它會在陣列中查找模型並將其保存。

解決這個是recursive實體(模型)設置爲-1或(嘗試,我不知道,只是打印出來的數據,看看什麼出來)的一種方式。您可以在模型中設置:var $recursive = -1;或控制器方法(動作):$this->ModelName->recursive = -1;

更多關於遞歸:http://book.cakephp.org/view/439/recursive

這真是類似於harpax建議,只是如果你不需要說數據,將它告訴Cake,以便它不會獲取它。

0

問題是,當保存您的Location時,您給了save方法一個包含所有DepartmentsLocations的數組。因此CakePHP銷燬所有東西並嘗試重新創建它。

這是蛋糕一個常見的錯誤,因爲它往往會拉太多的結果你。

一定要通過只需要保存,或更好地只獲取你需要的DATAS的數據。