Cake HABTM没有正确删除连接表中的行

时间:2012-08-25 02:15:06

标签: cakephp has-and-belongs-to-many

这几天让我感到非常悲痛,所以我向社区寻求帮助。

假设有两个表 - 专辑HABTM Customer 连接表是customer_albums PK(album_id,customer_id)

我有两个控制器功能:

public function like($album_id) {
 if ($this->request->is('post')) {
  $this->Album->CustomerAlbum->save(array('album_id' => $album_id,'customer_id' => $this->Auth->user('id')));
  $this->redirect(Controller::referer());

 }
}

这一个......

public function unlike($album_id) {
 $this->log($album_id);
 if ($this->request->is('post')) {
  $this->Album->CustomerAlbum->deleteAll(array('album_id' => $album_id,'customer_id' => $this->Auth->user('id'),false));
  $this->redirect(Controller::referer());

 }
}

“Like”函数导致SQL:

INSERT INTO gre49302_digital.customer_albums (album_id, customer_id) VALUES (1, 62)

这就是我所期望的。

然而,“不同”功能导致:

SELECT CustomerAlbum.album_id FROM gre49302_digital.customer_albums AS CustomerAlbum WHERE album_id = 1 AND customer_id = 62

DELETE CustomerAlbum FROM gre49302_digital.customer_albums AS CustomerAlbum WHERE CustomerAlbum.album_id = (1)

这表明CakePHP不理解复合主键的概念。

因此,当尝试删除客户与相册之间的“喜欢”时,我最终会删除所选相册的所有内容。

理想情况下,“不同”函数应该只使用复合主键作为选择器从customer_albums中删除单个记录。

1 个答案:

答案 0 :(得分:-1)

这可能是可能的原因。您当前的代码是:

deleteAll(array('album_id' => $album_id, 'customer_id' => $this->Auth->user('id'), false));

我假设您打算将cascade设置为false。如果是这种情况,则您的括号顺序错误。

将您的代码更改为:

deleteAll(array('album_id' => $album_id, 'customer_id' => $this->Auth->user('id')), false);

请注意('id')), false) vs ('id'), false))