Vaporドキュメント学習廿二:FLUENT-Relation

4158 ワード

Relationsでは、2つのデータベースを外部キーで関連付けることができます.これはベースのSQLデータベースでは一般的ですが、NoSQLのデータベースでも使用できます.FluentのRelationsには以下のものがあります.
  • Parent (BelongsTo)
  • Children (HasMany, HasOne)
  • Siblings (ManyToMany, BelongsToMany)

  • Parent
    1つのエンティティは、別のエンティティの外部キーに関連付けることで、親関係(parent)を構成します.次のようになります.
    pets
    - id
    - owner_id
    - name
    - type
    
    owner
    - id
    - name
    

    ここで、各petsは、1つのownerを有することができる.petからownerにアクセスするには、.parent()を呼び出します.ps:owneridをowner_idと外部キーとしてpetsに関連付けると、ownerpetsparentである.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クラスを拡張した後、ownerIdpet.を追加する必要はありません.また、戻りタイプが決定されているため、Owner.selfというパラメータも必要ありません.Parentタイプはクエリー可能なオブジェクトであり、deleteおよびfilterを使用してparentを操作できることを意味する.
    try pet.owner().delete()
    

    取得parentは、get()を呼び出す必要があります.
    let owner = try pet.owner().get()
    

    Children ChildrenParentの関係は逆であり、これまでの例をまとめると、ownerpetsを問い合わせることもできる.
    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(兄弟姉妹)SiblingsParentChildの関係とは異なり、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によって確立された関係をバックアップするために、このpivotDropletpreparationsに簡単に追加すればよい.
    let drop = Droplet()
    drop.preparations += [
        Toy.self,
        Pet.self,
        Pivot.self
    ]
    

    ≪要約|Summary|emdw≫:このセクションでは、表間の関連関係と、関連関係によるデータ・クエリーの方法について説明します.最後に、Pivotのバックアップ方法について説明します.