页面表
(1)
|
|
(*)
User_Moderate_Page(*)-----------(1)Access_level表
(*)
|
|
(1)
用户表
我如何在CakePhp中建模这样的三元关系? 用户到页面可以使用hasBelongtoMany关系建模。但User_Moderate_page只是一个关联表,我是否应该在Cake中为User_Moderate_Page编写一个Model?
答案 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',并带有每个主表的外键:
通常我们定义表之间的HABTM关系,在这种情况下我们需要为连接表创建一个蛋糕模型 - 让我们称之为 FirstsSecondsThird (通过cakePhp的命名约定)
您需要定义的模型之间的关系是:
此处解释了对此的需求 - 协会: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。它很复杂,但它是你需要的(特别是如果你需要灵活设置谁可以调节什么页面)