mORMot2 定义多对多关系
处理“has many”和“has many through”关系时,主要涉及到的是多对多关系的数据库设计和管理。以下是对您提供的文本的技术性翻译和解释:
- 多对多关系是通过一个专门为这种关系创建的表来追踪的,将这个关系转变为两个指向相反方向的一对多关系。
- 默认情况下,必须创建两个TOrm(即INTEGER类型)字段,命名为“Source”和“Dest”。第一个字段指向源记录(具有TOrmMany发布属性的那个),第二个字段指向目标记录。请注意,根据设计,这些源/目标表是作为TOrm*指针存储的,因此在32位系统上限制为32位ID值。
- 您应该首先创建一个继承自TOrmMany的类型,该类型将定义枢轴表,并在需要时提供可选的“through”参数。
下面的代码示例展示了如何在Pascal中定义这样的类型:
// 产品目标类的定义
TOrmProductDest = class(TOrm);
// 前置声明产品源类,因为后面会在TOrmProductDestPivot中使用
TOrmProductSource = class;
// 产品源和目标之间的关联类(即枢轴表)
TOrmProductDestPivot = class(TOrmMany)
protected
fSource: TOrmProductSource;
fDest: TOrmProductDest;
fTime: TDateTime;
published
property Source: TOrmProductSource map Source column read fSource;
property Dest: TOrmProductDest map Dest column read fDest;
property AssociationTime: TDateTime read fTime write fTime;
end;
// 产品源类定义
TOrmProductSource = class(TOrm)
protected
fDestList: TOrmProductDestPivot;
published
property DestList: TOrmProductDestPivot read fDestList;
end;
- 在所有情况下,任何TOrmMany的子类中都必须至少声明两个作为TOrm子项的'Source'和'Dest'发布属性,因为它们对于'多对多'关系是必需的。
- 当TOrm中存在TOrmMany发布属性时,它会被TOrm.Create自动初始化。
- 要向枢轴表中添加一些关联,请使用ManyAdd()方法。
- 要检索关联,请使用ManySelect()方法。
- 要删除关联,请使用ManyDelete()方法。
- 要读取所有目标记录的ID,请使用DestGet()方法。
- 要读取目标记录和相关的“through”字段内容,请使用FillMany,然后使用FillRow、FillOne和FillRewind方法来循环遍历记录。
- 要读取所有源记录和相关的“through”字段内容,请使用FillManyFromDest,然后使用FillRow、FillOne和FillRewind方法。
- 要在连接到枢轴表后读取所有目标ID,请使用DestGetJoined方法。