Cakephp habtm : 하나의 항목 편집 Casuses HABTM ROW를 재현하려면 추가 데이터를 파괴합니다.

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

문제

CakePHP에서 내 HABTM 관계에 어려움이 있습니다.

나는 다음과 같은 두 가지 모델이 있습니다. Department HABTM Location. 하나의 대기업에는 많은 건물이 있으며 각 건물에는 제한된 수의 서비스가 제공됩니다. 각 건물에는 자체 웹 페이지가 있으므로 HABTM 관계 자체 외에도 각 HABTM ROW에는 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;
    }
}
?>

컨트롤러는 완전히 흥미롭지 않습니다.

문제 :a의 이름을 편집하면 Location, 모든 DepartmentsLocation그것과 연결된 s Location 빈 URL로 재창조됩니다. 모델은 고유 한 것이 사실이라고 지정하기 때문에 모든 최신 행이 오래된 행을 덮어 쓰게되므로 모든 URL이 본질적으로 파괴됩니다.

두 가지를 알고 싶습니다. 이것을 멈출 수 있습니까? 그렇다면 어떻게?

그리고 덜 기술적이고 더 많은 Whiney 참고 사항 : 왜 이런 일이 발생합니까? 케이크를 통해 필드를 편집하는 것은 Phpmyadmin을 쉽게 통과 할 수있을 때 너무 많은 어려움을 겪을 것이라는 것이 기괴한 것 같습니다. Location 거기에 이름을 붙이고 내가 기대할 결과를 정확히 얻으십시오. CakePHP는 왜 필드를 행에서 편집 할 때 HABTM 데이터에 접촉합니까? 외국 열쇠조차 아닙니다!

도움이 되었습니까?

해결책

요리 책에서 첫 번째 문제는 다음과 같습니다.

기본적으로 Hasandbelongstomany 관계를 저장할 때 Cake는 새로운 행을 저장하기 전에 Join 테이블의 모든 행을 삭제합니다.

데이터에 외국 키가 없더라도 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