我有一个用 CakePHP 构建的简单朋友系统,有两个表:用户和朋友
Users
id,
username,
password
Friends
id
user_id
friend_id
status
要列出用户的朋友,我执行以下操作:
$user = $this->User->find('first', array( 'conditions' => array('User.username' => $username)));
// First get a list of friend ids
$friendsList = $this->Friend->find('list',
array(
'conditions'=>array(
'Friend.user_id'=>$user['User']['id'],
'Friend.status'=>1
),
'fields'=>array(
'Friend.friend_id'
)
)
);
// Then list users with matching ids
$friends = $this->User->find('all',
array(
'conditions'=>array(
'User.id'=>$friendsList
),
)
);
现在,这可以很好地列出用户已加为好友的好友,因为它正在拉取用户 ID 在好友表中匹配的好友 ID 列表。问题是,如果一个朋友与该用户加为好友,那么列中的 ID 将被反转,因此在查看一个用户时它不会显示友谊,但另一个用户会......如果这有意义吗?
我该如何解决?我基本上需要在用户的两列中找到所有匹配的 id,然后取出与该行匹配的朋友 id 或用户 id。
我也发布了模型(尽管我认为它们对于这个问题并不重要,因为问题在于查询而不是正在工作的关系)。
用户模型:
public $hasAndBelongsToMany = array(
'User'=>array(
'className' => 'User',
'joinTable' => 'friends',
'with' => 'Friend',
'foreignKey' => 'user_id',
'associationForeignKey' => 'friend_id'
)
);
朋友模型是虚拟化的!
谢谢
编辑:这样做可以解决问题:
// First get a list of friend ids
$friendsList1 = $this->Friend->find('list',
array(
'conditions'=>array(
'Friend.user_id'=>$user['User']['id'],
'Friend.status'=>1
),
'fields'=>array(
'Friend.friend_id'
)
)
);
$friendsList2 = $this->Friend->find('list',
array(
'conditions'=>array(
'Friend.friend_id'=>$user['User']['id'],
'Friend.status'=>1
),
'fields'=>array(
'Friend.user_id'
)
)
);
$friendsList = array_merge($friendsList1,$friendsList2);
// Then list users with matching ids
$friends = $this->User->find('all',
array(
'conditions'=>array(
'User.id'=>$friendsList
),
)
);
但是,如果我假设我有大量用户数据库,那么性能可能会相当差。