将HABTM记录保存到数据库CakePHP

时间:2013-08-06 21:46:21

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

我正在使用CakePHP 2从事关注者/关注系统。 我使用users表和user_users表设置了我的数据库。 users表是包含系统上每个用户的主表,而user_users表包含关注者的记录。

然后我有一个UsersController,User模型和Follower模型。

我可以成功输出一个按钮,根据当前登录的用户是否跟随他们正在查看的个人资料所属的用户,跟随或关注,但是我无法理解该怎么做,是创建表中新的以下关系。换句话说,我不知道如何在user_users表中创建记录。

我不确定这个逻辑应该去哪里,因此我的“跟随”按钮应该指向什么。

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

任何帮助非常感谢, 邓肯

1 个答案:

答案 0 :(得分: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请求修改数据库 - 我真的不应该这样做(这是几年前的旧代码)。您将要为添加和删除方法强制执行POST请求,因为他们正在修改数据库。

但是,这段代码应该让你走上正轨。