使用另一个连接表的id连接Table

时间:2016-07-05 15:10:56

标签: mysql cakephp orm associations cakephp-3.0

我目前正在尝试为项目构建后端。在这个项目中,您将能够创建" 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

我想知道这个查询是否可行。或者,如果整个事情过于灵活。

2 个答案:

答案 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 列。