我目前正在尝试为项目构建后端。在这个项目中,您将能够创建" ContentElements"可用于显示页面中的内容(在我的案例中为站点)。每个ContentElement都可以有多个选项。当用户使用ContentElement(例如标题)创建新站点时,他将输入该元素的所有选项。例如:
"src": "/img/bg.jpg",
"text": "Lorem ipsum..."
为了保存选项的每页使用值,我将这些值存储在一个单独的表中(content_elements_sites_values)。
我的计划目前看起来像这样:data scheme
所以我目前正在尝试做的是,当我获得与网站相关的所有数据时,我也想从< content_elements_sites_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'
]
]);
我真的不知道这是否可能,或者即使我的设计"是一个总牛市。但我想不出另一种存储填充数据的方法。我对提供存储此数据的更好方法的建议持开放态度。请询问您是否需要更多信息以帮助我。
提前谢谢!
修改
我试着更好地解释我想要实现的目标。
每个网站可以包含多个相同类型的 content_elements (关联存储在 content_elements_sites 联结表中)。
每个 content_element 都可以包含多个 content_element_options
所有 content_element_options 和 content_elements 均由管理员定义。
其他用户可以创建网站并使用 content_elements 填充该网站,并为所有 content_element_options 输入 content_elements_sites_value 。由于相同的 content_element (例如段落或列表)可能在同一网站中出现多次,因此我需要存储用户输入的每个 content_elements_sites_value 。
这就是为什么我在 content_elements_sites 和 content_element_options 之间建立了链接。
目前我正在使用此查询来获取所有期望值:
$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',
]
]
]
]
]
]);
这导致空 content_elements_sites_values
(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,
}
我的计划目前看起来像这样:data scheme
我想知道这个查询是否可行。或者,如果整个事情过于灵活。
答案 0 :(得分:0)
也许这就是你要找的东西:
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);
不要忘记在模型表中定义关联关系。
答案 1 :(得分:0)
您定义关系的方式表示您希望采用非常模块化的方法,以便内容元素可以与多个站点一起使用,内容元素选项可以与多个内容元素一起使用。
如果是这种情况,架构方向看起来没什么变化:
1) content_elements_sites_values 表可以直接使用 site_id 列,而不是 content_elements_sites_id 列,因为该网站对于该表中的条目始终是唯一的 content_elements_sites 的连接ID不是必需的。
2) content_elements_sites_values 表可以重命名为 content_element_options_values 。
3)您可以从 content_elements_sites 和 content_elements_sites_values 联结表中删除 id 列。