我正在尝试构建一个工具来帮助我的团队规划活动。部分图解释我的问题:
Actions
hasMany Teams
通过hasManyThrough(actions_teams
)具有不同的角色(即潜在客户,次要角色)
Actions
通过hasManyThrough(linkages
)链接到父/子关系中的其他操作
REQUIRED:
我希望能够知道,对于给定Action
。id
,在给定角色中附加(actions_team
)Team
(s),执行这些操作Team
(s)将linkage
返回Action
。id
(即列出Action
。id
作为linkages
中的父级})?
通过使用循环和/或Containable
能够高度控制返回的数据,我已经想出了如何在两个控制器甚至视图中执行此操作。但是,我会经常提出这个问题,我宁愿以某种方式在数据库中实现它。
我需要的关系似乎是2个连接表的连接表? (actions_teams
和linkages
)。或者是使用counterCache
的解决方案?我被卡住了。
任何建议或提示将不胜感激。 TIA!
答案 0 :(得分:1)
必须假设联系只有1级(即,我们不能从其父级以外的子项检查。如果您的给定action_id是团队行动的祖父母或曾祖父母,这将不起作用。 )而不是创建1个带有(可能)派生表,子选择等的巨型SQL语句,而不是从视图开始建立“潜在团队列表”。
如果没有看到实际数据,请创建此视图以确保存在不同的列表(如果这三个字段包含唯一索引,您可以避免使用此视图。)
CREATE VIEW vw_team_listing AS
SELECT DISTINCT team_id, action_id, action_role_id
FROM actions_teams;
{案例陈述是因为你问,“团队有联系吗?”您可以为那些已经或者没有链接(而不是两者)}
的团队创建一个select语句SELECT vw_team_listing.team_id AS team_id,
CASE
WHEN EXISTS(
SELECT *
FROM linkages
JOIN actions_teams
ON linkages.child_action_id = action_teams.action_id
WHERE linkages.parent_id = vw_team_listing.action_id
AND actions_teams.team_id = vw_team_listing.team_id
)
THEN 'Linked'
ELSE 'Not Linked'
END AS answer
FROM vw_team_listing
WHERE vw_team_listing.action_id = 'GIVEN_ACTION_ID'
AND vw_team_listing.action_role_id = 'GIVEN_ACTION_ROLE_ID';