我无法使用CakePHP 2建立友谊。
我有两个数据库表: 用户和朋友 。 我的用户表有以下几列:
和我的朋友表有以下几列:
我有朋友设置为我的用户模型中的hasAndBelongsToMany关系:
<?php
class User extends AppModel {
public $hasAndBelongsToMany = array(
'Friends' => array(
'className' => 'User',
'joinTable' => 'friends',
'foreignKey' => 'user_id',
'associationForeignKey' => 'friend_id',
'unique' => true
)
);
}
现在,当我尝试找回朋友的用户,它仅列出指定的用户发起的友谊,即其中user_id
等于用户ID; 它没有给我看其他人可能已经发起请求的朋友(即在当前用户的ID是在friend_id
列)。
我怎么能取的朋友,所以记录,其中无论是user_id
或friend_id
列等于一个特定的ID?
我不认为你明白HABTM是如何工作的。 阅读本书的这一部分 。 您需要除了你有关系的工作表一个friends_users表。 我认为,如果你要这样设置它,你需要定义一个友好具有和属于多个用户。
然而,我怀疑是否适合目前设定你想要一个HABTM关系。 这似乎是一个用户的hasMany朋友,仅此而已。 考虑使用这种关系,正如你期望它它会给你相关的ID。 不要忘记定义朋友属于关联用户。
在这里我的生命蛋糕规范2.0友谊教程。 我下载了CakePHP的2.1,所以我有一个新的开始。 我第一次改变了我的安全盐和密码,然后加了我的数据库连接。 然后我我的结构数据库,如下所示:
数据库 :
users
表:
id | int(11)
created | datetime
username | varchar(255)
friendships
表:
id | int(11)
user_from | varchar(255)
user_to | varchar(255)
created | datetime
status | varchar(50)
显然,你的用户表可以/将有更多的东西,但是这是我所需要的最低限度。
型号 :
好吧,这是棘手的部分。 下面是我在我的用户模型中定义的关系。
class User extends AppModel {
/* Other code if you have it */
var $hasMany = array(
'FriendFrom'=>array(
'className'=>'Friendship',
'foreignKey'=>'user_from'
),
'FriendTo'=>array(
'className'=>'Friendship',
'foreignKey'=>'user_to'
)
);
var $hasAndBelongsToMany = array(
'UserFriendship' => array(
'className' => 'User',
'joinTable' => 'friendships',
'foreignKey' => 'user_from',
'associationForeignKey' => 'user_to'
)
);
/* Again, other code */
}
这里是我的友谊模式:
class Friendship extends AppModel {
/* Other code if you have it */
var $belongsTo = array(
'UserFrom'=>array(
'className'=>'User',
'foreignKey'=>'user_from'
),
'UserTo'=>array(
'className'=>'User',
'foreignKey'=>'user_to'
)
);
/* Again, other code */
}
注意在机型 :友谊新型属于2个用户。 用户模型有3个协会。 用户模型中两个的hasMany关系的访问友谊模型的数据都别名,所以我们可以用$this->User->FriendTo
或$this->User->FriendFrom
从控制器去友谊模型。 起初我称这些UserFrom和用户至,镜像友谊模式的设置,但蛋糕扔约相似之处一个hissyfit,所以我不得不让他们更加不同。
控制器和视图 :我烤使用烘烤程序控制器和视图。 然后,我创建了两个用户(丹尼尔和马丁),并创造了丹尼尔一个新的友谊,马丁的状态requested
。 然后我更新了友谊状态confirmed
。
我创建了以下无形的自定义用户操作以证明有关从UsersController友谊数据检索:
public function test() {
$data = $this->User->FriendFrom->find('all',
array(
'conditions'=>array('user_from'=>1),
'contain'=>array('UserTo')
)
);
die(debug($data));
}
这一发现使用的usermodel的的hasMany关系,获得友谊的模型,并得到了相关user_from
和user_to
数据,其中与1号用户发起的关系的关系。
您的具体发现 :
马丁,你要寻找的发现是在这种制度下超级简单,虽然你可以采取不同的方式,你永远是处理类似的方法,只要简单地因为总会有双方的关系。 所有您需要做的就是关系在您的用户ID是用户1或用户2的列表(在我的情况,只是让我知道是谁发起的关系,我把它们存储为user_to和user_from-我想这是你吓倒)。 然后,我经历了整个阵列的迭代,选择基于相关数据的朋友我是否用户1或2,鉴于阵列英寸 这是一个非常简单的方法,我只是把它放在我的用户模型。 改变模具(调试()); 要return $friendslist
能够从您的控制器调用它,并得到一个数组回来。
public function getFriends($idToFind) {
$data = $this->FriendFrom->find('all',
array(
'conditions'=>array(
'OR'=> array(
array('user_to'=> $idToFind),
array('user_from'=> $idToFind)
)
)
)
);
$friendslist = array();
foreach ($data as $i) {
if ($i['FriendFrom']['user_from'] == $idToFind){
$friendslist[] = $i['UserTo'];
}
elseif ($i['FriendFrom']['user_to'] == $idToFind){
$friendslist[] = $i['UserFrom'];
}
}
die(debug($friendslist));
}