如何在CakePhp中建模三元关系?

时间:2011-08-31 02:56:35

标签: database cakephp

页面表
(1)
|
|
(*)
User_Moderate_Page(*)-----------(1)Access_level表
(*)
|
|
(1)
用户表

我如何在CakePhp中建模这样的三元关系? 用户到页面可以使用hasBelongtoMany关系建模。但User_Moderate_page只是一个关联表,我是否应该在Cake中为User_Moderate_Page编写一个Model?

3 个答案:

答案 0 :(得分: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

现在,我不确定Cake是否会烘焙此表,因此您可能需要手动制作模型,此表将属于其他3个表。其他3个表非关联表必须与其他2个关联表具有HMABTM关系,如用户HMABTM access_levels和页面等。

再次,不确定它是否会起作用。我建议也许试着看看你是否可以用不同的方式对它进行建模。

答案 1 :(得分:1)

让我通过使用泛型表来描述它来概括它: 假设你有3个表 - 第一,第二,第三 - 每个都有主键'id'。

让你的连接表被称为'firsts_seconds_thirds',并带有每个主表的外键:

  • first_id
  • second_id
  • third_id
  • <此关联表的其他字段>

通常我们定义表之间的HABTM关系,在这种情况下我们需要为连接表创建一个蛋糕模型 - 让我们称之为 FirstsSecondsThird (通过cakePhp的命名约定)

您需要定义的模型之间的关系是:

  • 首先 hasMany FirstsSecondsThird
  • 第二个 hasMany FirstsSecondsThird
  • 第三个 hasMany FirstsSecondsThird
  • FirstsSecondsThird belongsTo First,Second,Third

此处解释了对此的需求 - 协会: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()。阅读它here
您还需要考虑这些连接表的ON DELETE RESTRICT / CASCADE并对它们进行适当的建模。

答案 2 :(得分:0)

查找ACL。它很复杂,但它是你需要的(特别是如果你需要灵活设置谁可以调节什么页面)