2010-09-27 87 views
1

我有一个名为user_relationship的表。其中有两个外键引用回用户表来映射他们是朋友。

CREATE TABLE `user_relationships` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `status` varchar(255) default 'pending', 
    `time` datetime default NULL, 
    `user_id` int(11) unsigned NOT NULL, 
    `friend_id` int(11) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_user_relationships_users1` (`user_id`), 
    KEY `fk_user_relationships_users2` (`friend_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

当我尝试烤它自然不明白,friend_id必须引用用户模块。我想手动编辑的代码。可是,有一些问题了解哪些部分在以下

var $belongsTo = array(
    'User' => array(
     'className' => 'User', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Friend' => array(
     'className' => 'Friend', 
     'foreignKey' => 'friend_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ) 
); 

编辑在我想是指的friend_id到用户表

'Friend' => array(
     'className' => 'Friend', 
     'foreignKey' => 'friend_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ) 

我尝试了这部分代码这样做..我需要改变什么吗?

'Friend' => array(
     'className' => 'Friend', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ) 

回答

2

这个怎么样?

class UserRelationship { 

    var $belongsTo = array(
     'User' => array(
      'className' => 'User', 
      'foreignKey' => 'user_id' 
     ), 
     'Friend' => array(
      'className' => 'User', 
      'foreignKey' => 'friend_id' 
     ) 
    ); 

} 

class User { 

    var $hasAndBelongsToMany = array(
     'Friend' => array(
      'className' => 'User', 
      'joinTable' => 'user_relationships', 
      'foreignKey' => 'user_id', 
      'associationForeignKey' => 'friend_id', 
      'with' => 'UserRelationship' 
     ) 
    ); 

} 

关联可以从不同的观点可以看出:

User  <- Relationship ->  User 
|      |     | 
hasMany   belongsTo    | 
Relationship <- User (user_id)  hasMany 
|     User (friend_id) -> Relationship 
|          | 
HABTM         HABTM 
User  <---------------------->  User 

你的 “物理” 的布局,即数据库模式,是User -> Relationship -> User。尽管你真正想要的关系是User -> User关系。技术上,这意味着一个User hasAndBelongsToMany User关联(也称为多对多关系)。由于它采用三种模式,一个多一对多关联可以细分为:

  • 用户的hasMany关系/关系属于关联用户
  • 关系属于关联用户/用户的hasMany关系

你不't 需要 hasAndBelongsToMany关联,但这是你真正想要的。您根本不需要关系模型,因为它只是连接两个用户的帮助器模型,但如果想要指定其关联,则它有两个belongsTo关联。

+0

可以解释为什么我们需要使用$ hasAndBelongsToMany。不能我用2 hasMany完成它? – 2010-09-27 07:46:37

+0

http://book.cakephp.org/view/1046/Multiple-relations-to-the-same-model – 2010-09-27 07:51:43

+1

@哈沙更新了一个尝试的解释... – deceze 2010-09-27 08:04:52

1

您的'朋友'的类名是错误的。由于你没有表格“朋友”,所以没有模型“朋友”,并且因为他们共享同一个表格,所以你引用类“用户”。

'Friend' => array(
    'className' => 'User', 
    'foreignKey' => 'friend_id', 
    'conditions' => '', 
    'fields' => '', 
    'order' => '' 
) 
+0

感谢很多TIM。 'Friend'=> array()是指什么? – 2010-09-27 07:39:53

+1

它引用您的用户表并使用“friend_id”作为外键。 – Tim 2010-09-27 07:42:38

+0

谢谢TIM明白了:D – 2010-09-27 07:58:16

1

我可以用下面的闪避:

class User extends AppModel { 
    var $hasAndBelongsToMany = array(
     'Friends1' => array(
      'className' => 'User', 
      'joinTable' => 'friends', 
      'foreignKey' => 'user_id', 
      'associationForeignKey' => 'friend_id', 
      'with' => 'Friend' 
     ), 
     'Friends2' => array(
      'className' => 'User', 
      'joinTable' => 'friends', 
      'foreignKey' => 'friend_id', 
      'associationForeignKey' => 'user_id', 
      'with' => 'Friend' 
     ) 
    ); 

    function afterFind(array $results) { 

     // Merge both sides of the relationship into one alias 
     foreach ($results as $key=>$result) { 
      if (isset($result["Friends1"]) && isset($result["Friends2"])) { 
       $results[$key]["Friends"] = array_merge($result["Friends1"], $result["Friends2"]); 
       unset($results[$key]["Friends1"]); 
       unset($results[$key]["Friends2"]); 
      } 
     } 

它的混乱,但你的想法:抓住关系的双方,那么数据库之后,将它们合并阅读:)