2013-05-30 96 views
0

我讀the CakePHP book但無法做到。
我有一個名爲frendslists的表格。每個用戶(owner_user_id)都有太多朋友,我將這些朋友添加到friend_id列。 (型號名稱爲Friendslist)CakePHP模型鏈接,belongsTo,hasOne

CREATE TABLE IF NOT EXISTS `friendslists` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `owner_user_id` int(20) unsigned NOT NULL, 
    `friend_id` int(20) NOT NULL COMMENT 'id of the friend', 
    PRIMARY KEY (`id`), 
    KEY `friend_id` (`friend_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

--id-------owner_user_id-----friend_id 
-------------------------------------- 
--1--------1234--------------9200----- 
--2--------1234--------------3210----- 
--3--------1234--------------7600----- 

我也有一個profiles表。每個獨特的人都有一個簡介。一個人只能有一個配置文件。 (型號名稱爲配置文件)

CREATE TABLE IF NOT EXISTS `profiles` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `profile_user_id` int(20) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `location` varchar(50) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `profile_user_id` (`profile_user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

--id------profile_user_id---name------location- 
----------------------------------------------- 
--1-------9200--------------michael----usa----- 
--2-------3210--------------john-------uk------ 
--3-------7600--------------danny------denmark- 

我想鏈接好友列表到配置文件表。這是一對一(hasOne)還是多對一(belongsTo)類型關係?

當我查詢friendslist表我想獲取朋友的配置文件數據。我應該在CakePHP模型和表中做什麼?

我創建了一個外鍵是這樣的:

ALTER TABLE `friendslists` 
    ADD CONSTRAINT `friendslists_ibfk_1` 
    FOREIGN KEY (`friend_id`) 
    REFERENCES `profiles` (`profile_user_id`) 
    ON DELETE CASCADE ON UPDATE CASCADE; 

我改變模型文件到這一點:

class Friendslist extends AppModel { 
    var $name = 'Friendslist'; 
    var $useTable = 'friendslists'; 

    public $belongsTo = array(
     'Profile' => array(
      'className' => 'Profile', 
      'foreignKey' => 'friend_id' 
     ) 
    ) 

    function getAll(){ 
     return $this->find('all'); 
    } 
} 

最後,當我這樣做:

$records=$this->Friendslist->find('all', array('conditions' => array(
    'Friendslist.owner_user_id' => 1234) 
)); 

我得到這些結果:

 [Friendslist] => Array 
      (
       [id] => 1 
       [owner_user_id] => 1234 
       [friend_id] => 9200 
      ) 

     [Profile] => Array 
      (
       [id] => 
       [profile_user_id] => 
       [name] => 
       [location] => 
      ) 

    ) 

我確定個人檔案表有一個profile_user_id = 9200的記錄。但個人資料記錄是空的。

回答

0

我有點困惑你爲什麼要鏈接好友列表到個人資料。將人們與人聯繫起來,然後從中得到個人資料是否更有意義?

在任何情況下,有什麼你所描述的是一個HasAndBelongsToMany(HABTM)

因此,在您Person模型要指定,他們有很多其他人(或者你的情況分析),他們在相關並指定查找表。

喜歡的東西...

public $hasAndBelongsToMany = array(
     'Person' => array(
      'className' => 'Profile', 
      'joinTable' => 'friendslists', 
      'foreignKey' => 'owner_id', 
      'associationForeignKey' => 'friend_id' 
     ) 
    ); 

然後在好友列表模型中我把它描述爲一個屬於關聯上市既所有者和輪廓。

喜歡的東西:

public $belongsTo = array(
    'Person' => array(
      'className' => 'Person' 
      ,'foreignKey' => 'owner_user_id' 
     ), 
    'Profile' => array(
      'className' => 'Profile' 
      ,'foreignKey' => 'friend_id' 
     ) 
); 

您可能需要調整的名字,因爲我有一個很難消化的實體是在玩什麼,但至少應該給你一個想法。