我无法自拔,目前很烦人,是的,我经常使用谷歌。
类似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'])); ?>
答案 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