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方法。