【问题标题】:Cake HABTM not deleting rows in join table correctlyCake HABTM 没有正确删除连接表中的行
【发布时间】:2012-08-25 02:15:05
【问题描述】:

这几天让我非常难过,所以我向社区寻求帮助。

假设有两个表 - Album HABTM 客户 连接表是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)

这是我所期望的。

但是,“Unlike”函数会导致:

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 不理解复合主键的概念。

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

理想情况下,“unlike”函数应该使用复合主键作为选择器从 customer_albums 中删除一条记录。

【问题讨论】:

  • 我对连接表结构进行了一些更改——删除现有的(复合)主键并创建一个新的 id INT pk。完成此操作后,Cake 在删除和插入方面都按照预期运行。 id INT pk 在逻辑上超出了要求,但似乎需要使 Cake 正常运行。理想情况下,我不想创建这个额外的主键,但在这个阶段似乎没有它就无法实现结果。如果有人有任何想法/想法 - 他们将不胜感激。

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


【解决方案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)('id'), false))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多