HATBM 不适合这种情况。从食谱:
HABTM 数据被视为一个完整集,每次添加新的数据关联时,数据库中的完整关联行集都会被删除并再次创建,因此您始终需要传递整个数据集以进行保存。有关使用 HABTM 的替代方法,请参阅 hasMany through(连接模型)
出于这个原因,HABTM 主要适用于非常“愚蠢”的关系。我已经在诸如用户必须选择许多兴趣的情况下使用它 - 他们只是得到一个复选框列表,他们可以在其中单击多个兴趣,然后一键保存它们。
在您的情况下,拥有一个带有自己模型的单独表格会更容易。我称之为关系或类似的东西。它将有一个 id、followed_by_id、following_id 以及您可能需要的任何其他字段。
我从一个旧的 cake 1.3 应用程序中挖掘了一些代码,但它应该可以帮助你。您的关系模型如下所示:
<?php
class Relationship extends AppModel {
var $name = 'Relationship';
var $belongsTo = array(
'FollowedBy' => array(
'className' => 'User',
'foreignKey' => 'followed_by_id'
),
'Following' => array(
'className' => 'User',
'foreignKey' => 'following_id'
)
);
}
?>
您的用户模型必须具有如下关系:
var $hasMany = array(
'Followers' => array(
'className' => 'Relationship',
'foreignKey' => 'following_id',
'dependent'=> true
),
'FollowingUsers' => array(
'className' => 'Relationship',
'foreignKey' => 'followed_by_id',
'dependent'=> true
),
);
然后在你的关系控制器中,你会有这样的方法:
function add($following_id = null) {
$this->Relationship->create();
$this->Relationship->set('followed_by_id',$this->Auth->User('id'));
$this->Relationship->set('following_id',$following_id);
$this->Relationship->save();
$this->redirect($this->referer());
}
function delete($id = null) {
$this->Relationship->delete($id);
$this->redirect($this->referer());
}
请注意,在该代码中,我正在使用 GET 请求修改数据库——我真的不应该这样做(这是多年前的旧代码)。您需要对 add 和 delete 方法都执行 POST 请求,因为它们正在修改数据库。
但是,该代码应该让您走上正确的轨道。