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

Posted

技术标签:

【中文标题】使用另一个连接表的 id 连接表【英文标题】:Join Table with the id of another join table 【发布时间】:2016-07-05 15:10:55 【问题描述】:

我目前正在尝试为项目构建后端。在这个项目中,您将能够创建可用于在页面中显示内容的“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_optionscontent_elements 均由管理员定义。

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

这就是我在 content_elements_sitescontent_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

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

【问题讨论】:

【参考方案1】:

您定义关系的方式表示您希望采用非常模块化的方法,以便一个内容元素可以用于多个站点和一个内容元素选项可以与多个内容元素一起使用。

如果是这种情况,架构方向看起来没问题,只需进行少量更改:

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_sitescontent_elements_sites_values 联结表中删除 id 列。

【讨论】:

但是如果我在 content_elements_sites_values。我会更新我的问题,因为我没有说清楚——对不起。但你是对的,它将非常灵活。这让我很头疼:) 我明白了。然后,您可以继续使用 content_elements_sites_id。就查询而言,您应该使用 matching() 而不是 contain() 因为您想根据关联条件限制主表结果。在这里一步一步进行 - 首先获取 2 个关联,检查调试工具包中的查询,直接在数据库中触发它,如果需要进行更改,然后向其中添加第三个关联并重复。 Ref【参考方案2】:

也许这就是你要找的东西:

$site = $this->Sites->get($id, [
    'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'],
....]);

不要忘记在模型表中定义关联关系。

【讨论】:

但这只是编写相同查询的另一种方式。我目前正在尝试改写我的问题。

以上是关于使用另一个连接表的 id 连接表的主要内容,如果未能解决你的问题,请参考以下文章

sql语句左连接右连接区别

MySQL 更新一个表里的字段等于另一个表某字段的值

根据另一个表的小计更新字段

mysql更新列内部连接另一个表

mysql多对多

mysql多对多