使用另一个加入 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_optionscontent_elements 均由管理员定义。

另一个用户可以创建一个 站点 并用 content_elements 填充它并输入 content_elements_sites_value 所有 content_element_options。由于相同的 content_element(例如一个段落或一个列表)可以在同一站点中多次出现,我需要存储每个 content_elements_sites_value 用户输入。

这就是为什么我在 content_elements_sitescontent_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_sitescontent_elements_sites_values[ 中删除 id 列=31=]结tables.