2011-08-31 50 views
2

頁表
(1)
|
|
(*)
User_Moderate_Page(*)-----------(1)ACCESS_LEVEL表
(*)
|
|
(1)
用戶表
如何在CakePhp中建立三元關係?

如何I型在CakePHP這樣的三元關係? 用戶到頁面可以使用hasBelongtoMany關係進行建模。但是User_Moderate_page只是一個關聯表,我甚至應該在Cake中爲User_Moderate_Page編寫一個模型?

回答

1

我不確定CakePHP是否接受此操作,但您應該做的是使用主鍵和3個外鍵創建表。有點像這樣:

CREATE TABLE IF NOT EXISTS `mydb`.`access_levels_pages_users` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `page_id` INT NOT NULL , 
    `access_level_id` INT NOT NULL , 
    `user_id` INT NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_access_levels_pages_users_pages` (`page_id` ASC) , 
    INDEX `fk_access_levels_pages_users_access_levels1` (`access_level_id` ASC) , 
    INDEX `fk_access_levels_pages_users_users1` (`user_id` ASC) , 
    CONSTRAINT `fk_access_levels_pages_users_pages` 
    FOREIGN KEY (`page_id`) 
    REFERENCES `mydb`.`pages` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_access_levels_pages_users_access_levels1` 
    FOREIGN KEY (`access_level_id`) 
    REFERENCES `mydb`.`access_levels` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_access_levels_pages_users_users1` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `mydb`.`users` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

現在,我不知道將蛋糕烤這個表,所以你可能要嘗試做手工模型,這個表必須屬於關聯的其他3個表。其他3個非關聯表必須與其他2個關係具有HMABTM關係,例如用戶HMABTM訪問級別和頁面等。

再次,不知道它是否會工作。我會建議也許試着看看你是否可以用不同的方式建模。

0

查找ACL。這是複雜的,但它是你所需要的(尤其是如果你需要設置誰可以調節什麼頁面的靈活性)

1

讓我用通用表來描述它: 假設你有3個表格 - 第一個,秒,三分之一 - 每個都帶有主鍵'id'。

讓你的連接表被稱爲 'firsts_seconds_thirds' 與外鍵到每一個主表:

  • first_id
  • second_id該關聯表的額外
  • third_id
  • <領域>

通常我們定義t之間的HABTM關係ABLES,在這種情況下,我們需要創建一個連接表蛋糕模型 - 讓叫它FirstsSecondsThird(通過CakePHP的命名約定)

您需要定義模型之間的關係是:

  • 第一的hasMany FirstsSecondsThird
  • 的hasMany FirstsSecondsThird
  • 的hasMany FirstsSec ondsThird
  • FirstsSecondsThird 屬於關聯第一,第二,第三

的需要,這是在這裏解釋 - 協會:Linking Models Together
代碼相同:

class First extends AppModel {  
    public $hasMany = array(
     'FirstsSecondsThird' => array(
      'className' => 'FirstsSecondsThird', 
      'foreignKey' => 'first_id' 
     ) 
    ); 
} 

//Same for classes 'Second' and 'Third' 

class FirstsSecondsThird extends AppModel { 
    public $belongsTo = array(
     'First' => array(
      'className' => 'First', 
      'foreignKey' => 'first_id' 
     ), 
     'Second' => array(
      'className' => 'Second', 
      'foreignKey' => 'second_id' 
     ), 
     'Third' => array(
      'className' => 'Third', 
      'foreignKey' => 'third_id' 
     ) 
    ); 
} 

的模型是完全建立,但現在插入/更新/從主/連接表中刪除應該正確完成,否則它們是沒有用的。 Model::saveMany()Model::saveAssociated(),需要使用'deep'等選項。閱讀有關它here
您還需要考慮關於這些連接表的ON DELETE RESTRICT/CASCADE,並對它們進行適當的建模。