0

我有一个用 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
        ),
    )
);

但是,如果我假设我有大量用户数据库,那么性能可能会相当差。

4

1 回答 1

1

我认为您希望这是一个递归表,以便模型正常工作。您本质上希望用户对用户产生影响。所以你的模型应该看起来更像这样。

 public $hasAndBelongsToMany = array(
        'User'=>array(
            'className'              => 'User',
            'joinTable'              => 'users_user',
            'foreignKey'             => 'user_id',
            'associationForeignKey'  => 'friend_id',
            'fields'                 => array('id','user_id','friend_id'),
        )
 );

然后您可以查询 User 模型并获取所有应有的关系。像这样:

$friends = ($this->User->Friend->find('all', array('conditions'=>array(
    'Friend.id'=>$loggedinuserid,
                    "OR" => array (
                     "User.id" => $loggedinuserid,
                    ) 
))));

或者,如果您的原始模型有效:

$friendsList = $this->Friend->find('list', 
    array(
        'conditions'=>array(
           'Friend.status'=>1,
           "OR"=>array(
                 array('Friend.friend_id'=>$user['User']['id']),
                 array('Friend.user_id'=>$user['User']['id'])
                )
        ),
        'fields'=>array(
            'Friend.user_id'
            'Friend.friend_id'
        )
    )
);
于 2012-12-16T10:57:03.783 回答