2010-09-27 86 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"]); 
      } 
     } 

它的混亂,但你的想法:抓住關係的雙方,那麼數據庫之後,將它們合併閱讀:)