与CakePHP中一个表的多个关系

时间:2012-04-11 19:43:25

标签: php cakephp

在我的应用中,用户可以与其他用户成为朋友。所以他们在两个表之间有多对多的关系。以这种方式: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());
}

问题是什么?

1 个答案:

答案 0 :(得分: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');
}

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

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

public function getFriends($username) {
   return $this->find('all', array(
     'conditions' => array(
       'User.username' => $username, 
       'User.status'=>1
      ),
      'contain' => array(
        '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
                )
        )
)

这里的每个朋友键实际上都是用户模型结果。

您可以在此处详细了解HABTM:http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm