谢谢您的建议!
背景 我正在创建一个数据库来跟踪客户下的订单。
“ Orders
”表存储有关订单的常规详细信息,例如客户的姓名,订单日期和交货日期。
单独的“ Order_Items
”表存储了客户已订购的特定商品。
这是'Orders
表和'Order_Items
'表之间的一对多关系,即一个'Order
'可以有很多'Order_Items
',但每个'Order_Item
'必须仅与一个'Order
'相关联。
当前状态
目前,我有一个页面,用户可以在其中创建新的“ Order
”记录。然后,用户被带到另一个页面,他们可以在其中创建订单所需的许多“ Order_Item
”记录。
期望状态
我要实现的是:当用户创建新的“ Order_Item
”记录时,它会自动将当前的“ Order
”记录分配为新的“ Order_Item
”记录的外键。
到目前为止我尝试过的事情
用户的手动操作:在“ Order
”及其所有“ Order_Items
”之间建立链接的一种方法是添加一个下拉菜单小部件,它可以有效地询问用户诸如“所有这些商品都属于哪个订单号”?用户的操作随后将在两个表之间建立链接并关联一个'Order
',其中有许多'Order_Items
'。但是,我的目标是改为以编程方式处理此步骤。
官方文档:我提到了offical documentation,它很有用,但是由于我仍在学习中,所以我并不确切知道要搜索什么。 prefetch功能看起来很有希望,但实际上并没有建立链接。它只会更有效地加载关联的记录。
App Maker教程:我发现一个App Maker tutorial创建了一个HR App,用户可以在其中创建“ Departments
”列表,然后创建一个列表。 'Employees
',然后将'Employee
'链接到'Department
'。但是,在示例应用程序中,此连接是由用户手动建立的。在我想要的状态下,我希望以编程方式建立链接。
手动保存模式:
我还尝试过切换到manual save mode,以便用户必须先创建草稿“ Orders
”记录,然后再创建多条草稿“ Order Items
”记录,然后一次保存它们。但是,我还没有做到这一点。我不确定这种方法的失败是否是因为1)我试图在多个表上创建草稿记录,2)我做得不正确,或者3)我以为我在该草稿的某处读过记录已弃用。
其他想法
我对该领域非常陌生,可能是错误的,但是我觉得我可能需要使用一些脚本来建立链接。例如,也许我可以使用全局变量来记住用户创建的“ Order
”。然后,对于每个'Order_Item
',我可以使用onBeforeCreate
事件来触发一个脚本,该脚本建立被记住的'Order_Item
'和'Order
'之间的链接来自先前建立的全局变量。
更新的问题
感谢Markus和Morfinismo的回答。我一直使用两个答案都取得了一些成功。
Morfinismo:我已经在现有记录上成功使用了您指导我的代码,但似乎无法使其用于新创建的记录。
例如:
widget.datasource.createItem(); // This creates a new record
var managerRecord = app.datasources.Manager.item; // This sets the Manager of the currently selected parent record as a variable successfully.
var teamRecord = app.datasources.Teams.item; // This attempts to set the Manager of the currently selected record as a variable. However, the record that was created in line 1 is not selected. Therefore, App Maker does not seem to know which record this line of code relates to and returns the error Cannot set property ‘Manager’ of null.
// Assign the manager to the team.
teamRecord.Manager = managerRecord; // This successfully assigns the manager but only in cases where the previous line of code was successful (i.e. existing records and not newly created ones).
您对如何将此代码应用于第1行中的初始代码行创建的记录有任何建议或评论吗?
答案 0 :(得分:0)
我在您的问题下发表的评论包括指向official documentation的链接,该链接解释了您的需求。无论如何,您的问题尚不清楚,无法确定您是通过客户端脚本还是通过服务器脚本创建记录,因此这是一个非常通用的答案。
要通过client script管理关系:
var managerRecord = app.datasources.Manager.item;
var teamRecord = app.datasources.Teams.item;
// Assign the manager to the team.
teamRecord.Manager = managerRecord;
// Changes are saved automatically if the datasource in auto-save mode
// Add a team member to a Manager's team.
// Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
var engineerRecord = app.datasources.TeamMember.item;
teamRecord.Members.push(engineerRecord);
要通过server script管理关系:
// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");
// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;
// Note: The new association is not saved yet
// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);
// Save both changes to the database.
app.saveRecords([teamRecord]);
以上信息直接取自官方文件,就像我说的,我在您的问题下发表的评论中提到了
。答案 1 :(得分:0)
我发现针对诸如您这样的情况创建相关项目的最简单方法是,实际上是导入一个数据源设置为Parent: Child (relation)
或Parent: Child (relation) (create)
的表单。因此,在您的情况下,数据源需要设置为Order: Order_Items (relation)
。
您可以使用表单小部件向导以两种不同的方式来完成此任务:
选项1:
选项2:
Inherited: Order
。在数据源选择部分中向下滚动,直到找到Order: Order_Items (relation)
,然后选择“仅插入”或“编辑”表单,然后选择所需的表单域。在您的Order模型中,确保正确设置了安全设置,以允许用户在Order中创建Order_Items的关系。我认为这是最简单的方法,因为您不必将父代硬编码到表单或客户端/服务器脚本中。它自动基于当前选择的父级,并且基本上执行@Morfinismo在客户端脚本部分中说明的相同操作。