在CakePHP的2.x的友谊(Friendships in CakePHP 2.x)

2019-09-18 21:07发布

我无法使用CakePHP 2建立友谊。

我有两个数据库表: 用户朋友 。 我的用户表有以下几列:

  • ID
  • 电子邮件
  • 密码

和我的朋友表有以下几列:

  • ID
  • 用户身份
  • friend_id
  • 批准

我有朋友设置为我的用户模型中的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_idfriend_id列等于一个特定的ID?

Answer 1:

我不认为你明白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_fromuser_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));
}


文章来源: Friendships in CakePHP 2.x