我正在与参与者一起使用自引用 HABTM 模型。您注册了一个活动,当您登录到您的预订/个人资料时,您会看到其他参与者的列表,您可以选择将自己和其他人添加到不同的组中;共享酒店房间,共享机场交通等。
到目前为止我所管理的:
1) 在我的个人资料中,我看到所有其他参与者的列表,带有复选框。到目前为止很棒。
2)添加另一个参与者工作正常。下次我编辑时,我添加的参与者显示为已选中。
3)删除另一个参与者也可以,只要您在提交之前仍然检查参与者!
再说一遍:
有3名参与者。我以其中之一的身份登录,我在参与者列表中看到另外 2 个人。我选择检查他们两个。这工作正常(总是)。后来我选择删除其中一个(通过取消选中复选框并点击提交)。这也可以正常工作(总是)。如果我想删除最后一个复选框......没有任何更新(总是!)。奇怪的是,我可以添加和删除任何奇怪的参与者组合,除非我选择一次性删除所有参与者(删除一个且唯一的参与者是“删除所有已检查的参与者”的特殊情况),否则它将始终有效。
据我所知,HABTM 的工作原理是首先删除所有关系,然后重新保存它们。当我一遍又一遍地删除、添加、删除、添加同一个参与者时,我可以在我的表格中看到 - HABTM 表格上的 id 总是在增加。但是,当我一次取消选择所有参与者时,关系不会更新。id 保持不变,所以就像保存从未发生过一样。
这种行为是如此具体和奇特,我觉得我在这里遗漏了一些明显的东西。无论如何,这是相关的代码:
模型
类参与者扩展 AppModel { var $hasAndBelongsToMany = 数组( '好友' => 数组( 'className' => '参与者', 'joinTable' => 'participants_participants', 'foreignKey' => 'participant_id', 'associationForeignKey' => 'buddy_id', '独特' => 真的, ) );
控制器
功能编辑($id = null){ if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid Participant', true)); $this->redirect(array('action'=>'index')); } if (!empty($this->data)) { if ($this->Participant->saveAll($this->data)) { $this->Session->setFlash(__('参与者已被保存', true)); $this->redirect(array('action'=>'index')); } 别的 { $this->Session->setFlash(__('无法保存参与者。请重试。', true)); } } 如果(空($this->data)){ $this->data = $this->Participant->read(null, $id); } // 获取除你自己以外的所有参与者 $allParticipants = $this->Participant->find('list', array('conditions' => array('participant.id ' => $id))); // 获取所有将您添加到他们列表中的参与者 $allBuddies = $this->Participant->ParticipantsParticipant->find('list', array( '条件' => 数组('buddy_id' => $id), 'fields' => 'ParticipantsParticipant.participant_id', 'order' => 'ParticipantsParticipant.participant_id ASC' )); $this->set(compact('allParticipants','allBuddies')); }
看法
echo $form->create('参与者'); echo $associations->habtmCheckBoxes($allParticipants, $this->data['buddy'], 'buddy', 'div', '\'border: 1px solid #000;\'', '\'border: 1px solid #000;\''); echo $form->end('提交');
我正在使用稍微修改过的帮助程序 habtmCheckBoxes,可在此处找到:http ://cakeforge.org/snippet/detail.php?type=snippet&id=190 它的工作原理如下: function habtmCheckBoxes($rows=array(), $selectedArr =array(), $modelName, $wrapTag='p', $checkedDiv, $uncheckedDiv) {}