1

在我的应用程序中,用户可以与另一个用户成为朋友。因此,它们在两个表之间具有多对多关系。以这种方式:Users > Friends < Users

表格如下所示:

Users:
id
username
password

Friends:
id
user_id_from
user_id_to

我已经像这样设置了模型:

class User extends AppModel
{
    public $name = 'User';

    public $hasOne = 'Profile';

    public $hasMany = array(
        'Post',
        'Answer',
    'Friend'
    );

    public $actsAs = array('Containable');
}

class Friend extends AppModel
{
    var $name = 'Friend';

    var $belongsTo = array(
        'Sender' => array(
            'className' => 'User',
            'foreignKey' => 'user_id_from'
        ),
        'Recipient' => array(
            'className' => 'User',
            'foreignKey' => 'user_id_to'
        )
    );

    public $actsAs = array('Containable');
}

但是它似乎没有正确链接它们?

我在用户模型中使用此代码:

public function getFriends($username)
    {
        return $this->find('all', array('conditions' => array('User.username' => $username, 'Friend.status'=>1)

        ));
    }

然后在访问类似的网址时/users/USERNAME/friends,应列出该人的朋友。调用它的方法是:

public function index( $username )
{   
    $friends = $this->User->getFriends($username);

    $this->set('friends', $this->paginate());
}

有什么问题?

4

1 回答 1

2

对于朋友关系,您应该使用 HABTM 而不是 hasMany。

class User extends AppModel
{
    public $name = 'User';

    public $hasOne = 'Profile';

    public $hasMany = array(
        'Post',
        'Answer',
    );

    public $hasAndBelongsToMany = array(
      'Friend' => array(
        'className' => 'User',
        'joinTable' => 'friends',
        'foreignKey' => 'user_id_to',
        'associationForeignKey' => 'user_id_from',
      )
    );

    public $actsAs = array('Containable');
}

删除您当前的 Friend 模型,因为它不需要并且可能会混淆 Cake。

您的getFriends()方法将如下所示:

public function getFriends($username) {
   return $this->find('all', array(
     'conditions' => array(
       'User.username' => $username, 
       'User.status'=>1
      ),
      'contain' => array(
        'Friend'
      )
   ));
}

在这里,我们搜索 User 模型并包含该用户的所有 Friend 记录。Cake 会自动获取连接表数据并包含用户数据。$this->User->getFriends('Jeremy');将返回如下所示的数据:

Array
(
    [User] => Array
        (
            [id] => 1
            [username] => Jeremy
        )
    [Friend] => Array
        (
           [0] => Array
                (
                    [id] => 2
                    [username] => Cameron
                )
           [1] => Array
                (
                    [id] => 3
                    [name] => Mark
                )
           [2] => Array
                (
                    [id] => 4
                    [name] => Bob
                )
        )
)

这里的每个 Friend 键实际上是一个 User 模型结果。

您可以在此处阅读有关 HABTM 的更多信息:http: //book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

于 2012-04-11T23:32:27.130 回答