mORMot2 定義多對多關係

海利鸟發表於2024-04-25

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

相關文章