リレーション

Current version: 4.0

リレーションは、エンティティ同士をリンクするために使用されます。 このページでは、リレーションとその値を取得する方法とそれらの値を変更する方法について説明します。

リレーション タイプ

Content Hub には、次の 4 つの主なリレーション タイプがあります。

  • IChildToOneParentRelation
  • IChildToManyParentsRelation
  • IParentToOneChildRelation
  • IParentToManyChildrenRelation

これらは最も厳密に型指定されたインターフェイスであり、ほとんどの場合に使用が推奨されます。 ただし、次のインターフェイスからも派生します (適切な場合)。

  • IChildRelation
  • IParentRelation
  • IToOneRelation
  • IToManyRelation
  • IRelation

これらのインターフェイスは、多型に使用したり、型を厳密に指定していない場合はリレーションとすばやく連携したりすることができます。

[!注] リレーションのタイプは、リレーション定義のカーディナリティ、および必要とされるリレーション側のロールによって異なります。

リレーションの取得

リレーションはエンティティから取得できます。

[!注] プロパティ名の大文字と小文字は区別されません。

非汎用

タイプを指定せずにリレーションを取得するには、次のようにします。

RequestResponse
import { IRelation } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relation";

var relation : IRelation = entity.getRelation("AssetTypeToAsset");

汎用

型指定されたリレーションを取得するには、次のようにします (推奨されるアプローチ)。

RequestResponse
import { IRelation, RelationBase } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relation";
import { IChildToManyParentsRelation } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relations/child-to-many-parents-relation";

var childToManyParentsRelation = entity.getRelation("AssetTypeToAsset") as IChildToManyParentsRelation;

リレーションのタイプを確認するには、以下のようなスクリプトを実行します。

RequestResponse
import { IRelation, RelationBase } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relation";
import { IChildToManyParentsRelation } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relations/child-to-many-parents-relation";

var relation: IRelation = entity.getRelation("AssetTypeToAsset");
if (RelationBase.isChildToManyParentsRelation(relation)){
}

[!注] リレーションが見つからないか場合や読み込まれていない場合は、null が返されます。 ただし、リレーションは遅延読み込みされることがあります。 詳細については、遅延読み込みを参照してください。

[!注] 読み込まれたすべてのリレーションは、IEntity.Relations プロパティを使用してアクセスすることができます。 これは、たとえば、LINQ を使用してリレーションをフィルタリングする場合に役立ちます。

リレーション値

使用されているリレーション インターフェイスによって、値の取得と設定にはさまざまな方法があります。 詳細な概要については、API docsを 参照してください。

非汎用

IRelation は、値に対する複数の操作をサポートします。 これが最も簡単にリレーションを操作する方法かもしれませんが、エラーは発生しやすくなります。 4 つの主なリレーション インターフェイスを使用し、それらのプロパティを使用することをお勧めします。

値を取得すると、常に ID のリストが返されます。 リレーションが IToManyRelation である場合は、リストには 0 個以上の値を含めることができます。 リレーションが IToOneRelation の場合は、空のリストまたは 1 つの値だけを返します。

RequestResponse
var values: number[] = relation.getIds();

値の設定は、ID のコレクションを渡すことによって行われます。 リレーションが IToManyRelation である場合は、リストには 0 個以上の値を含めることができます。 リレーションが IToOneRelation である場合は、リストには 0 個または 1 個の値を含めることができます。

RequestResponse
relation.setIds(ids)

リレーションの値をクリアするには、次のようにします。

RequestResponse
relation.clear();

汎用

厳密に型指定されたリレーションは、値をより適切にサポートします。 たとえば、IParentToManyChildrenRelation parentToManyChildrenRelation を取得します。

その子を取得するには、次のようにします。

RequestResponse
var children :number[] = parentToManyChildrenRelation.children;

子を追加するには、次のようにします。

RequestResponse
parentToManyChildrenRelation.add(id);

別の便利な例としては、addRange があります (一度に複数のアイテムを追加)。

RequestResponse
parentToManyChildrenRelation.addRange(ids);

自己参照リレーションの処理

自己参照リレーションは、リレーションの両側で同じエンティティ定義を参照するリレーションです。 これにより、エンティティ上で同じ名前の 2 つのリレーション オブジェクトが作成されます。

非汎用的な方法でリレーションを取得する場合は、必要なロールを指定する必要があります。 そうでない場合は、InvalidOperationException がスローされます。一致するリレーションが 2 つあるからです。

RequestResponse
import { IRelation } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relation";
import { RelationRole } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base";

var relation: IRelation = entity.getRelation("SelfReferencingRelation", RelationRole.Child);

汎用的な方法でリレーションを取得する場合は、SDK がインターフェイスからロールを抽出します。 したがって、次の例は、通常の自己参照リレーションで機能します。

RequestResponse
import { IRelation, RelationBase } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relation";
import { IChildToManyParentsRelation } from "@sitecore/sc-contenthub-webclient-sdk/dist/contracts/base/relations/child-to-many-parents-relation";

var childToManyParentsRelation = entity.getRelation("SelfReferencingRelation
") as IChildToManyParentsRelation;

これにより、内部でロール Child が抽出されます。

Do you have some feedback for us?

If you have suggestions for improving this article,