Vaporドキュメント学習廿二:FLUENT-Relation
4158 ワード
Relationsでは、2つのデータベースを外部キーで関連付けることができます.これはベースのSQLデータベースでは一般的ですが、NoSQLのデータベースでも使用できます.FluentのRelationsには以下のものがあります. Parent (BelongsTo) Children (HasMany, HasOne) Siblings (ManyToMany, BelongsToMany)
Parent
1つのエンティティは、別のエンティティの外部キーに関連付けることで、親関係(parent)を構成します.次のようになります.
ここで、各
Convenience
クエリー
取得
Children
パラメータは
Convenience
戻り値には戻りタイプが明確になっているので、
Siblings(兄弟姉妹)
ご覧のように、
Convenience
逆に
検索
次に、複数対複数の関係を作成する方法を示します.
Preparation
≪要約|Summary|emdw≫:このセクションでは、表間の関連関係と、関連関係によるデータ・クエリーの方法について説明します.最後に、
Parent
1つのエンティティは、別のエンティティの外部キーに関連付けることで、親関係(parent)を構成します.次のようになります.
pets
- id
- owner_id
- name
- type
owner
- id
- name
ここで、各
pets
は、1つのowner
を有することができる.pet
からowner
にアクセスするには、.parent()
を呼び出します.ps:owner
idをowner_id
と外部キーとしてpets
に関連付けると、owner
はpets
のparent
である.1つのpets
があり、1つのowner
しかありません.(つまり息子が一人いて父親が一人しかいない)let pet: Pet = ...
let owner = try pet.parent(pet.ownerId, Owner.self).get()
parent()
のパラメータは、外部キーおよびparent
のタイプである.Convenience
クエリー
parent
をより簡単にするには、modelにメソッドを追加します.extension Pet {
func owner() throws -> Parent {
return try parent(ownerId)
}
}
Pet
クラスを拡張した後、ownerId
にpet.
を追加する必要はありません.また、戻りタイプが決定されているため、Owner.self
というパラメータも必要ありません.Parent
タイプはクエリー可能なオブジェクトであり、delete
およびfilter
を使用してparent
を操作できることを意味する.try pet.owner().delete()
取得
parent
は、get()
を呼び出す必要があります.let owner = try pet.owner().get()
Children
Children
とParent
の関係は逆であり、これまでの例をまとめると、owner
でpets
を問い合わせることもできる.let owner: Owner = ...
let pets = owner.children(Pet.self).all()
パラメータは
child
のタイプのみです.Convenience
Parent
と同様に、クエリーchild
を追加する方法を拡張します.extension Owner {
func pets() throws -> Children {
return try children()
}
}
戻り値には戻りタイプが明確になっているので、
Pet.self
というパラメータも必要ありません.Children
はクエリー可能なオブジェクトでもあるので、first()
,all()
,filter()
などのメソッドを呼び出すことができます.let coolPets = try owner.pets().filter("type", .in, ["Dog", "Ferret"]).all()
Siblings(兄弟姉妹)
Siblings
はParent
とChild
の関係とは異なり、Pivot
クラスをハブとする必要がある.例を挙げると、私たちのpets
に複数のtoys
があるとします.しかし、私たちもtoys
が複数のpets
で共有されることを望んでいます.Pivot
エンティティ(すなわち、関連テーブルを個別に作成する必要があります).pets
- id
- type
- owner_id
toys
- id
- name
pets_toys
- id
- pet_id
- toy_id
ご覧のように、
pets_toys
またはPivot
のエンティティが作成されました.Convenience
Pet
にショートカットを追加します.extension Pet {
func toys() throws -> Siblings {
return try siblings()
}
}
逆に
Toy
にも1つ追加します.extension Toy {
func pets() throws -> Siblings {
return try siblings()
}
}
検索
child
関係のように検索できます.let pet: Pet = ...
let toys = pet.toys().all()
次に、複数対複数の関係を作成する方法を示します.
var toy: Toy = ... // Create a new toy
try toy.save() // Save the toy to the db
var pet: Pet = ... // Create a new pet
try pet.save() // Save the pet to the db
// Link them together in the db
var pivot = Pivot(toy, pet) // Create the relationship
try pivot.save() // Save the relationship to the db
Preparation
Pivot
によって確立された関係をバックアップするために、このpivot
をDroplet
のpreparations
に簡単に追加すればよい.let drop = Droplet()
drop.preparations += [
Toy.self,
Pet.self,
Pivot.self
]
≪要約|Summary|emdw≫:このセクションでは、表間の関連関係と、関連関係によるデータ・クエリーの方法について説明します.最後に、
Pivot
のバックアップ方法について説明します.