2011-08-31 84 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,并对它们进行适当的建模。