2013-08-06 138 views
0

我正在使用CakePHP 2处理跟随者/跟随系统。 我已经为用户表和user_users表设置了我的数据库。 users表是包含系统中每个用户的主表,而user_users表包含关注者的记录。将HABTM记录保存到数据库CakePHP

然后我有一个UsersController,用户模型和追随者模型。

我可以成功输出一个按钮来说Follow或Follow取决于当前登录的用户是否跟随他们正在查看的配置文件所属的用户,但是我无法理解如何去做的是在表中创建新的关系。换句话说,我不知道如何在user_users表中创建记录。

我不知道这里的逻辑应该去哪里,因此我的“关注”按钮应该指向什么。

这可能是一个非常简单的问题,但我完全难住。我曾尝试向UsersController添加一个“跟随”操作,但我无法使其工作。

任何帮助非常赞赏, 邓肯

回答

2

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请求。

但是,该代码应该让你在正确的轨道上。

+0

非常感谢这个详细的答案。还没有机会对它进行测试,但无论如何,我会明白我现在需要做的事情。非常感谢您的帮助!一个非常好的回应。 – DuncanLewis