我希望有人愿意看看这种多对多关系。这个示例是针对Laravel项目的,但具体细节并不重要。
动作
+----+------+--------+-------------+------+--------+------------+
| id | name | script | description | icon | custom | project_id |
+----+------+--------+-------------+------+--------+------------+
管道(action_server
这是数据透视表)
+----+-----------+-----------+-------+
| id | action_id | server_id | order |
+----+-----------+-----------+-------+
服务器
+----+------+------------+------------+
| id | name | ip_address | project_id |
+----+------+------------+------------+
此多对多关系用于部署服务器,操作是部署管道中的一部分。
project_id
此概念在Laravel中有效,我可以根据给定的project_id
来获取我的操作。反过来,我可以使用action->servers()
获取运行部署所需的服务器操作。
我需要一种添加默认动作的方法。我希望能够为操作提供带有预定义脚本的功能,以供用户从部署管道中选择和添加,而不是始终使用由用户提供的脚本。
这些预定义的操作无法填充到action
表中,因为在那里定义的操作已绑定到project_id
中。这些必须是通用的。
我不能在当前设置中为这些预定义操作简单地创建另一个表,因为管道中的action_id
已经使用外键设置了。
到目前为止,感觉就像我在混两个概念,分别是pre-defined
操作和用户自己创建的user-defined
操作。它们需要处于同一管道中,并最终以正确的顺序运行。
关于如何实现此目标的任何想法?我愿意接受所有建议。
修改
将其绘制出来之后,似乎可行的解决方案是以action_project
的形式添加另一个数据透视表,这使我可以将project_id
从action
表中解耦(删除) 。我想知道如何在Laravel中保持这种状态。
action_project
+----+-----------+------------+
| id | action_id | project_id |
+----+-----------+------------+
答案 0 :(得分:1)
以概念性方式总结您的问题:
我认为您所需要的只是自定义操作和标准操作的概括,对应于包含这两种情况的超类“操作”。这将导致以下表格:
const CMInputField = ({label, value, onChange, rows, margin, style}, context) => {
let textFieldStyle = {"marginTop":0, "marginBottom":35};
if(firstOfType) textFieldStyle= {"marginTop":15, "marginBottom":35};
return (
<TextField
label={context.t(label)}
value={value}
onChange={onChange}
InputLabelProps={{shrink: true}}
style={textFieldStyle} //the defaulted one
fullWidth
multiline
rows={rows}
margin={margin}/>
);
};
<CMInputField
label="First Input"
value="Hello"
onChange={this.myFunction}
firstOfType={true}/>
<CMInputField
label="Second Input"
value="Hello Again"
onChange={this.myFunction2}
firstOfType={false}/>
,其中actions(id, type, name, description)
是type
或custom
standard
或者,您可以将custom_actions(id, script, icon, custom, project_id)
的属性附加到custom_actions
,对于标准操作 ,它们都为NULL。