CakePHP 2.0类推特按钮

时间:2013-03-25 07:00:28

标签: action cakephp-2.0 has-and-belongs-to-many twitter-follow

我无法自拔,目前很烦人,是的,我经常使用谷歌。

我需要什么:

类似Twitter的follow按钮,action跟随用户。

我已经做了什么:

数据库

users表:id,username,password,...

users_users table:id,user_id,follower_id

代码

在模型User.php

public $hasAndBelongsToMany = array(
'Follower' => array(
  'className' => 'User',
  'joinTable' => 'users_users',
  'foreignKey' => 'user_id',
  'associationForeignKey' => 'follower_id',
  'unique' => 'keepExisting',
) 
);

UsersController.php

public function follow() {
/*need help here*/
}

Users\index.ctp

<?php if ($current_user['id'] != $user['User']['id']) echo $this->Html->link('Follow', array('action' => 'follow', $user['User']['id'])); ?>

1 个答案:

答案 0 :(得分:0)

就个人而言,我没有发现hasAndBelongsToMany非常适合这种情况。当您想要显示复选框列表或选择列表时,它非常适合用户在一种形式中选择/管理所有以下内容(或任何关系)。

这可能仅仅是我个人的偏好,但在像你这样的情况下,你添加/删除单个链接而不担心与该用户相关的任何其他链接,我更喜欢创建一个单独的“关系”(或类似命名的模型/控制器,并将记录视为本身的事物,而不仅仅是hasAndBelongsToMany链接,它们都是“自动”管理的。

我是这样做的:

将users_users表命名为“relationship”。并将列命名为“follow_by_id”和“following_id”(或类似),以避免关注哪个用户是关注者/关注者(如果这是一个单词!)。

在您的用户模型中,您将拥有以下关系:

var $hasMany = array(
    'Followers' => array(
        'className' => 'Relationship',
        'foreignKey' => 'following_id',
        'dependent'=> true
    ),
    'FollowingUsers' => array(
        'className' => 'Relationship',
        'foreignKey' => 'followed_by_id',
        'dependent'=> true
    ),
);

然后你会有一个看起来像这样的关系模型($ belongsTo关系是重要的部分):

<?php
class Relationship extends AppModel {
    var $name = 'Relationship';

    var $validate = array(
        'followed_by_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
        'following_id' => array(
            'numeric' => array(
                'rule' => array('numeric'),
            ),
        ),
    );

    var $belongsTo = array(
        'FollowedBy' => array(
            'className' => 'User',
            'foreignKey' => 'followed_by_id'
        ),
        'Following' => array(
            'className' => 'User',
            'foreignKey' => 'following_id'
        )
    );
}
?>

然后在你的关系控制器中,你会有这样的事情:

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);
    if ($this->Relationship->save($this->data)) {
        // all good
    } else {
        // You could throw an error here if you want
        $this->Session->setFlash(__('Error. Please, try again.', true));
    }
    $this->redirect($this->referer());
}

然后要添加关系,你显然只需调用关系控制器的add方法。

注意:理想情况下,由于添加关系正在更改数据库,因此理想情况下不应使用常规URL访问的GET请求。应该通过POST提交表格来完成。我知道,通过与GET的常规链接来实现它似乎有点过分。在这个例子中我没有打算使用表单/ POST - 但是如果你想坚持最佳实践,那就是你应该做的。有关详情,请参阅此处:https://softwareengineering.stackexchange.com/questions/188860/why-shouldnt-a-get-request-change-data-on-the-server