HATBM是不适合在这种情况下。从the cookbook:
HABTM数据被视为一个完整的,每一个新的数据 关联添加一整套相关行的数据库 时间被删除并重新创建,所以你总是需要通过全 用于保存的数据集。对于使用HABTM看到的hasMany 通过另一种(在加入模型)
为此,HABTM主要是好漂亮的“哑巴”的关系。我曾在用户需要选择多个兴趣的情况下使用它 - 他们只是获得一个复选框列表,他们可以在其中点击多个兴趣点,并将它们全部保存在一个点击中。
就你的情况而言,使用它自己的模型有单独的表格会更容易。我会称之为关系或类似的东西。它将有一个id,followed_by_id,following_id和您可能需要的任何其他字段。
我已经挖了一些旧的蛋糕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请求。
但是,该代码应该让你在正确的轨道上。
非常感谢这个详细的答案。还没有机会对它进行测试,但无论如何,我会明白我现在需要做的事情。非常感谢您的帮助!一个非常好的回应。 – DuncanLewis