使用另一个加入 table 的 ID 加入 Table
Join Table with the id of another join table
我目前正在尝试为一个项目构建后端。在此项目中,您将能够创建 "ContentElements" 可用于在页面(在我的示例中为站点)中显示内容。每个 ContentElement 都可以有多个选项。当用户使用 ContentElement(例如 header)创建新站点时,他将输入该元素的所有选项。例如:
"src": "/img/bg.jpg",
"text": "Lorem ipsum..."
为了保存每页选项的值,我将这些值存储在单独的 table (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'
]
]);
我真的不知道这是否可能,甚至我的 "design" 完全是胡说八道。但我想不出另一种方法来存储填充的数据。我非常愿意接受有关更好的方式来存储这些数据的建议。请询问您是否需要更多信息以帮助我。
提前致谢!
编辑
我试着更好地解释我想要实现的目标。
每个站点可以有多个相同类型的content_elements(关联存储在content_elements_sites 路口 table).
每个content_element可以有多个content_element_options
所有 content_element_options 和 content_elements 均由管理员定义。
另一个用户可以创建一个 站点 并用 content_elements 填充它并输入 content_elements_sites_value 所有 content_element_options。由于相同的 content_element(例如一个段落或一个列表)可以在同一站点中多次出现,我需要存储每个 content_elements_sites_value 用户输入。
这就是为什么我在 content_elements_sites 和 content_element_options 之间创建了 link。
目前我正在使用这个查询来获取期望值的所有内容:
$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
我想知道这个查询是否可行。或者如果整个事情太灵活了。
也许这就是您要找的:
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);
别忘了在模型中定义关联关系table。
您定义关系的方式表明您希望采用非常模块化的方法,以便 一个内容元素 可以用于多个站点并且 a内容元素选项 可与多个内容元素一起使用。
如果是这样,架构方向看起来没问题,只需稍作改动即可:
1) content_elements_sites_values table 可以直接有 site_id 列而不是 content_elements_sites_id 列,因为站点对于该 table 中的条目始终是唯一的,因此 content_elements_sites 的连接 ID不需要。
2) content_elements_sites_values table可以重命名为content_element_options_values.
3) 您可以从 content_elements_sites 和 content_elements_sites_values[ 中删除 id 列=31=]结tables.
我目前正在尝试为一个项目构建后端。在此项目中,您将能够创建 "ContentElements" 可用于在页面(在我的示例中为站点)中显示内容。每个 ContentElement 都可以有多个选项。当用户使用 ContentElement(例如 header)创建新站点时,他将输入该元素的所有选项。例如:
"src": "/img/bg.jpg",
"text": "Lorem ipsum..."
为了保存每页选项的值,我将这些值存储在单独的 table (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'
]
]);
我真的不知道这是否可能,甚至我的 "design" 完全是胡说八道。但我想不出另一种方法来存储填充的数据。我非常愿意接受有关更好的方式来存储这些数据的建议。请询问您是否需要更多信息以帮助我。
提前致谢!
编辑
我试着更好地解释我想要实现的目标。
每个站点可以有多个相同类型的content_elements(关联存储在content_elements_sites 路口 table).
每个content_element可以有多个content_element_options
所有 content_element_options 和 content_elements 均由管理员定义。
另一个用户可以创建一个 站点 并用 content_elements 填充它并输入 content_elements_sites_value 所有 content_element_options。由于相同的 content_element(例如一个段落或一个列表)可以在同一站点中多次出现,我需要存储每个 content_elements_sites_value 用户输入。
这就是为什么我在 content_elements_sites 和 content_element_options 之间创建了 link。
目前我正在使用这个查询来获取期望值的所有内容:
$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
我想知道这个查询是否可行。或者如果整个事情太灵活了。
也许这就是您要找的:
$site = $this->Sites->get($id, [
'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);
别忘了在模型中定义关联关系table。
您定义关系的方式表明您希望采用非常模块化的方法,以便 一个内容元素 可以用于多个站点并且 a内容元素选项 可与多个内容元素一起使用。
如果是这样,架构方向看起来没问题,只需稍作改动即可:
1) content_elements_sites_values table 可以直接有 site_id 列而不是 content_elements_sites_id 列,因为站点对于该 table 中的条目始终是唯一的,因此 content_elements_sites 的连接 ID不需要。
2) content_elements_sites_values table可以重命名为content_element_options_values.
3) 您可以从 content_elements_sites 和 content_elements_sites_values[ 中删除 id 列=31=]结tables.