Mysql 具有另一个联接表id的联接表
我目前正在尝试为一个项目构建后端。在这个项目中,您将能够创建“ContentElements”,用于显示页面中的内容(以我的网站为例)。每个ContentElement都可以有多个选项。当用户使用ContentElement(例如header)创建新站点时,他将输入该元素的所有选项。例如:Mysql 具有另一个联接表id的联接表,mysql,cakephp,orm,associations,cakephp-3.0,Mysql,Cakephp,Orm,Associations,Cakephp 3.0,我目前正在尝试为一个项目构建后端。在这个项目中,您将能够创建“ContentElements”,用于显示页面中的内容(以我的网站为例)。每个ContentElement都可以有多个选项。当用户使用ContentElement(例如header)创建新站点时,他将输入该元素的所有选项。例如: "src": "/img/bg.jpg", "text": "Lorem ipsum..." 为了保存该选项在其中使用的每页的值,我将这些值存储在一个单独的表中(content\u elements\u s
"src": "/img/bg.jpg",
"text": "Lorem ipsum..."
为了保存该选项在其中使用的每页的值,我将这些值存储在一个单独的表中(content\u elements\u sites\u values)
我的方案目前如下所示:
因此,我目前试图做的是,当我获取与站点相关的所有数据时,我还希望从“内容\元素\站点\值”获取数据
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements' => [
'ContentElementOptions' => [
'ContentElementsSitesValues'
]
]
],
'conditions' => [
// Just to explain my problem.
'ContentElementsSites.id' => 'ContentElementsSitesValues.content_elements_sites_id'
]
]);
我真的不知道这是否可能,或者我的“设计”是否完全是胡说八道。但我想不出另一种方法来存储填写的数据。我非常乐意接受关于存储这些数据的更好方法的建议。请询问您是否需要更多信息以帮助我
提前谢谢你
编辑 我试图更好地解释我想要实现的目标 每个站点可以有多个相同类型的内容元素(关联存储在内容元素连接表中)。
每个内容元素可以有多个内容元素选项
(int) 1 => object(App\Model\Entity\ContentElementOption) {
'id' => (int) 7,
'content_element_id' => (int) 1,
'name' => 'Test',
'json_name' => 'test',
'option_type_id' => (int) 1,
'content_elements_sites_value' => null,
}
所有内容元素选项和内容元素均由管理员定义
另一个用户可以创建一个站点,并用内容元素填充该站点,然后为所有内容元素选项输入内容元素站点值。由于同一内容元素(例如段落或列表)可能在同一站点中多次出现,我需要存储用户输入的每个内容元素站点值
这就是为什么我创建了内容元素站点和内容元素选项之间的链接
目前,我正在使用此查询获取除值以外的所有内容:
$site = $this->Sites->find('all', [
'conditions' => [
'Sites.id' => $id
],
'contain' => ['ContentElements' => [
'sort' => [
'ContentElementsSites.order' => 'ASC'
],
'ContentElementOptions' => [
'ContentElementsSitesValues' => [
'conditions' => [
'ContentElementsSitesValues.content_elements_sites_id' => 'ContentElementsSites.id',
]
]
]
]
]
]);
这会导致内容元素站点值为空
(int) 1 => object(App\Model\Entity\ContentElementOption) {
'id' => (int) 7,
'content_element_id' => (int) 1,
'name' => 'Test',
'json_name' => 'test',
'option_type_id' => (int) 1,
'content_elements_sites_value' => null,
}
我的方案目前如下所示:
我想知道这个问题是否可行。或者,如果整个事情太灵活了。也许这就是你想要的:
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);
别忘了在模型表中定义关联关系。也许这就是您要寻找的:
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);
不要忘记在模型表中定义关联关系。您定义关系的方式意味着您希望采用非常模块化的方法,以便一个内容元素可以用于多个站点,一个内容元素选项可以用于多个内容元素 如果是这种情况,架构方向看起来没有什么变化: 1) content\u elements\u sites\u value表可以直接包含site\u id列,而不是content\u elements\u sites\u id列,因为站点对于该表中的条目总是唯一的,所以不需要content\u elements\u sites的连接id 2) 内容元素站点值表可以重命名为内容元素选项值
3) 您可以从content\u elements\u sites和content\u elements\u sites\u values连接表中删除id列。您定义关系的方式意味着您希望采用非常模块化的方法,以便一个content元素可以用于多个站点,一个content元素选项可以用于多个站点内容元素 如果是这种情况,架构方向看起来没有什么变化: 1) content\u elements\u sites\u value表可以直接包含site\u id列,而不是content\u elements\u sites\u id列,因为站点对于该表中的条目总是唯一的,所以不需要content\u elements\u sites的连接id 2) 内容元素站点值表可以重命名为内容元素选项值
3) 您可以从content\u elements\u sites和content\u elements\u sites\u values连接表中删除id列。但这只是编写相同查询的另一种方式。我现在正试图重新表述我的问题,但这只是写同样问题的另一种方式。我正在尝试重新表述我的问题。但是,如果我在content\u elements\u sites\u值中设置站点id,则同一页面中不可能出现多个content\u元素。我会更新我的问题,因为我没有说清楚——对不起。但你是对的,这将是非常灵活的。这让我头疼:)我明白了。然后,您可以继续使用content\u elements\u sites\u id。就查询而言,您应该使用matching()而不是contain(),因为您希望根据关联条件限制主表结果。在这里一步一步地进行-首先获取2个关联,检查调试工具包中的查询,直接在数据库中启动它,根据需要进行更改,然后向其中添加第3个关联并重复。但是,如果我在content\u elements\u sites\u值中设置site\u id,则同一页面中不可能出现多次content\u元素。我会更新我的问题,因为我没有说清楚——对不起。但你是对的,这将是非常灵活的。这让我头疼:)我明白了。然后,您可以继续使用content\u elements\u sites\u id。就查询而言,您应该使用matching()而不是contain(),因为您希望根据关联条件限制主表结果。在这里一步一步地进行-首先获取2个关联,检查调试工具包中的查询,直接在数据库中启动它,根据需要进行更改,然后向其中添加第3个关联并重复。