Cakephp habtm : 하나의 항목 편집 Casuses HABTM ROW를 재현하려면 추가 데이터를 파괴합니다.
-
21-09-2019 - |
문제
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는 모든 것을 파괴하고 그것을 재현하려고 노력합니다.
이것은 케이크에 대한 일반적인 실수입니다. 종종 너무 많은 결과를 얻을 수 있기 때문입니다.
저장 해야하는 데이터 만 전달하거나 필요한 데이터 만 가져 오기 위해 더 나은 데이터 만 전달하십시오.