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의 이름, 그 Location에 링크 된 DepartmentsLocation의 모든 빈 URL을 다시 만들어집니다를 편집합니다. 모델은 고유가 true를 지정하기 때문에 새로운 모든 행이 이전 행을 겹쳐 쓰게되므로 본질적으로 모든 URL이 삭제됩니다.

두 가지를 알고 싶습니다. 중단 할 수 있습니까? 그렇다면 어떻게?

그리고 기술이 적고 화제가되는 메모에는 왜 이런 일이 발생합니까? 내가 케익을 통해 필드를 편집하는 것이 너무 많은 문제를 야기한다는 것을 기괴하게 생각합니다. phpMyAdmin을 쉽게 방문하고 거기에 Location 이름을 편집하고 예상 한 결과를 정확히 얻을 수있을 때입니다. CakePHP가 연속으로 필드를 편집 할 때 HABTM 데이터를 만지는 이유는 무엇입니까? 외래 키조차 아니에요!

+0

기존 HABTM 항목을 다시 만들지 말라는 HABTM 정의의 "unique"=> 'keepExisting'' 옵션에 유의하십시오. 실제로 새로운 관계를 저장하고 싶지만 * 추가 ​​데이터를 잃고 싶지 않은 경우에 유용합니다. – Yogu

답변

1

요리 책에서 첫 번째 문제는 다음과 hasAndBelongsToMany의 관계를 저장할 때 기본적으로

가, 케이크 가 새로 저장하기 전에 조인 테이블 모든 행을 삭제합니다.

데이터에 외래 키가 없더라도 Cake가 HABTM 데이터를 저장하려고하는 이유가 확실치 않지만 쉬운 해결책이 있습니다. 간단히 destroy the association의 전화 저장 :이 일이 될 수 있습니다 하나의 이유 생각하고

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

. Location을 검색 할 때 locations_departments 데이터도 검색합니다. save($this->data)을 수행하면 배열의 모델을 찾아 저장합니다.

-1 또는 (단지 나오는 것을 볼 수있는 데이터를 출력, 잘 모르겠어요, 시도)에 (모델의)에 recursive 속성을 설정하는 것입니다 해결하는 방법. 당신은 모델에 설정할 수 있습니다 : var $recursive = -1; 또는 컨트롤러 방법 (행동)에 : $this->ModelName->recursive = -1;

재귀에 대한 자세한 : http://book.cakephp.org/view/439/recursive

그것은 당신은 필요하지 않은 단지 경우, harpax 제안 것과 정말 비슷를 데이터를 가져 오지 않도록 Cake에 알리십시오.

0

문제는 Location을 저장할 때 저장 방법에 모두 DepartmentsLocations을 포함하는 배열을 지정했기 때문입니다. 따라서 CakePHP는 모든 것을 파괴하고 다시 만들려고합니다.

종종 케이크가 너무 많아서 케이크와 자주 사용되는 실수입니다.

저장해야하는 데이터 만 전달하거나 필요한 데이터 만 가져 오는 것이 좋습니다.