HABTM과 관련된 두 가지 모델 : 부재 및 사용자가 있습니다. 문맥을 위해, 사용자는 결석을 신청합니다 (따라서, 사용자는 신청자에게 별칭이 부여되며 결석은 부재자에게 적용됩니다). HABTM 레코드를 추가하고 HABTM 레코드를 각각 제거하는 '적용'및 '취소'에 대한 컨트롤러 기능을 만들려고합니다. 하나의 레코드를 저장할 지점까지 코드를 가져 왔지만 그 이상은 아닙니다. 지금 '적용'에 대한 내 컨트롤러 코드는 두 개의 레코드를 추가하기 위해 하드 코드되어 있지만 마지막으로 요청한 코드 만 추가합니다. 여기 내 컨트롤러 코드입니다 :CakePHP는 saveAll에서 다른 HABTM 레코드를 삭제합니다.
function apply($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid id for absence', true));
$this->redirect(array('action'=>'index'));
}
$this->Absence->recursive = 1;
$user = $this->Session->read('User');
$absence = $this->Absence->read(null, $id);
$data = array(
array(
'Applicant' => array('id' => 1),
'Absence' => array('id' => 4)
),
array(
'Applicant' => array('id' => 2),
'Absence' => array('id' => 4)
)
);
//$data = array_unique($data);
if ($this->Absence->saveAll($data)) {
$this->Session->setFlash('Application was successful');
} else {
$this->Session->setFlash('Application failed');
}
$this->set(compact('data'));
}
내가 디버그 쿼리에서 처리되는 $ 데이터의 두 항목을 볼 수 있지만 어떤 이유 중 하나가 삭제됩니다. 왜 그런지 알아? 여기에 해당 컨트롤러 코드에 의해 실행되는 쿼리의 일부가 (19 주, 25을, 26) :
11 START TRANSACTION 0 0
12 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
13 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
14 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
15 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
16 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
17 UPDATE `absences` SET `id` = 4, `modified` = '2011-07-03 00:28:39' WHERE `absences`.`id` = 4 1 0
18 SELECT `AbsencesUser`.`user_id` FROM `absences_users` AS `AbsencesUser` WHERE `AbsencesUser`.`absence_id` = 4 0 0 0
19 INSERT INTO `absences_users` (`absence_id`,`user_id`) VALUES (4,1) 1 0
20 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
21 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
22 SELECT COUNT(*) AS `count` FROM `absences` AS `Absence` WHERE `Absence`.`id` = 4 1 1 0
23 UPDATE `absences` SET `id` = 4, `modified` = '2011-07-03 00:28:39' WHERE `absences`.`id` = 4 0 0
24 SELECT `AbsencesUser`.`user_id` FROM `absences_users` AS `AbsencesUser` WHERE `AbsencesUser`.`absence_id` = 4 1 1 0
25 DELETE `AbsencesUser` FROM `absences_users` AS `AbsencesUser` WHERE `AbsencesUser`.`absence_id` = 4 AND `AbsencesUser`.`user_id` = (1) 1 1
26 INSERT INTO `absences_users` (`absence_id`,`user_id`) VALUES (4,2) 1 0
27 COMMIT 0 123
나는 조인을위한 별도의 모델에 대한 섹션을 보았지만, 내가 필요로하는 것을 조합하지 않았다. 확고한 접근 방식처럼 보입니다. 감사! – Jay
감사합니다. 이것이 당신을 위해 작동하지 않으면 알려주십시오. 내 대답이 실제로 뭔가를 해결할 때가 마음에 듭니다. – cspray