ネストされたフィールドを使用して関連エントリをクエリする
Liferay 7.4 U69+/GA69+
nestedFields パラメータは、単一の GET リクエストで複数のレベルの関連オブジェクトエントリを返します。 nestedFields パラメーターに、クエリに含めるリレーションシップ名を渡します。各リレーションシップはカンマで区切ります。 nestedFields=[firstObjectRelationship],[secondObjectRelationship]。 関係が複数のレベルにまたがる場合は、 nestedFieldsDepth パラメーターを必要な深さに設定します。 最大 5 レベルまで含めることができます (例: nestedFieldsDepth=5)。
検索 パラメータ を使用して nestedFields の複数レベルを検索すると、パフォーマンスに影響があり、深さのレベルが増えるごとに悪化します。 関連オブジェクトの複数階層を検索するには、クエリを複数のリクエストに分割し、各クエリには1つの関係のみを含めるようにします。 このアプローチにより、パフォーマンス低下の連鎖を回避できます。
nestedFields パラメータは、関連するエントリを持つエントリを取得することでリクエストを最適化します。そうしないと、複数のリクエストが必要になります。 関連するエントリのみを返すために、Liferay は専用の リレーションシップ API を提供します。 概要については、 リレーションシップ REST API の使用 を参照してください。
先に進むには、 新しいLiferay 7.4インスタンスを セットアップし、 提供されているチュートリアルコードを 準備します。 次に、 スクリプト を実行して関連するエントリを作成し、 nestedFields パラメータを使用してクエリを実行します。
現在、システムオブジェクトとの1対多リレーションシップの 多 側でカスタムオブジェクトを使用する場合、ネストされたフィールドまたはリレーションシップへのアクセスは利用できません。 データの取得方法を計画する際には、この点を念頭に置いてください。
Liferayインスタンスのセットアップ
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、3つのオブジェクト定義を作成し、それらを関連付けます。
関連オブジェクト定義の作成
-
グローバルメニュー(
)を開き、[コントロールパネル]タブに移動し、[オブジェクト]をクリックします。 -
オブジェクトドラフトを3つ作成する。
最初のオブジェクト:
項目 値 ラベル Able複数形のラベル Ables名前 Able2番目の対象物:
項目 値 ラベル Baker複数形のラベル Bakers名前 Baker第三の目的:
項目 値 ラベル Charlie複数形のラベル Charlies名前 Charlie -
各オブジェクトのドラフトに、
名前テキスト フィールドを追加します。ラベル 項目名 種類 必須 Namenameテキストボックス ✔ -
以下の関連を定義します。
Ableの場合:
ラベル リレーション名 種類 オブジェクト Able to BakerableToBaker1 対多 パン ベイカー氏へ:
ラベル リレーション名 種類 オブジェクト Baker to CharliebakerToCharlie1 対多 チャーリー チャーリーへ:
ラベル リレーション名 種類 オブジェクト Charlie to AblecharlieToAble多対多 できる
公開後は、ヘッドレスAPIで各オブジェクトにアクセスすることができます。
サンプルコードを準備する
以下のコマンドを実行して、提供されているサンプルコードをダウンロードして解凍してください。
curl https://resources.learn.liferay.com/examples/liferay-w4s7.zip -O
unzip liferay-w4s7.zip
このZIPファイルには、REST APIを使用してオブジェクトエントリを作成、関連付け、およびクエリするためのcURLコマンドを実行するシェルスクリプトが含まれています。 これには、関連するエントリを照会するための2つのGETコマンドが含まれます。
サイトおよび会社オブジェクト用に生成された API の完全なリストについては、 オブジェクト ヘッドレス フレームワーク統合 を参照してください。 Liferay API Explorer を介してカスタムオブジェクト API を表示およびテストできます。 [server]:[port]/o/api (例: localhost:8080/o/api)。 REST アプリケーション をクリックして、API を選択します。
関連オブジェクトエントリの作成とクエリ
-
liferay-w4s7プロジェクトのcurlフォルダに移動します。cd liferay-w4s7/curl -
Ableエントリを作成するには、
Ables_POST_ToCompanyを実行します。./Ables_POST_ToCompany.sh次のPOSTコマンドで使用するために、最初のエントリーのIDをコピーします。
{ ... "externalReferenceCode" : "able-one", "id" : 47512, ... "name" : "Able 1" } { ... "externalReferenceCode" : "able-two", "id" : 47514, ... "name" : "Able 2" } { ... "externalReferenceCode" : "able-three", "id" : 47516, ... "name" : "Able 3" } -
Bakers_POST_ToCompanyを、able-oneの ID をパラメータとして使用して実行します。./Bakers_POST_ToCompany.sh [ableId]これにより、3 つの Baker エントリが作成され、
ableToBaker関係を使用して、指定された Able エントリに関連付けられます。各 Baker エントリには、3 つの
ableToBakerリレーションシップ フィールドがあります:ableToBakerERC、r_ableToBaker_c_ableId、およびr_ableToBaker_c_ableERC。{ ... "externalReferenceCode" : "baker-one", "id" : 47518, ... "name" : "Baker 1", "ableToBakerERC" : "able-one", "r_ableToBaker_c_ableId" : 47512, "r_ableToBaker_c_ableERC" : "able-one" } { ... "externalReferenceCode" : "baker-two", "id" : 47520, ... "name" : "Baker 2", "ableToBakerERC" : "able-one", "r_ableToBaker_c_ableId" : 47512, "r_ableToBaker_c_ableERC" : "able-one" } { ... "externalReferenceCode" : "baker-three", "id" : 47522, ... "name" : "Baker 3", "ableToBakerERC" : "able-one", "r_ableToBaker_c_ableId" : 47512, "r_ableToBaker_c_ableERC" : "able-one" }次のPOSTコマンドで使用するために、最初のBakerエントリIDをコピーしてください。
-
Charlies_POST_ToCompanyを、baker-oneの ID を使用してパラメータとして実行します。./Charlies_POST_ToCompany.sh [bakerId]これにより、3 つの Charlie エントリが作成され、
bakerToCharlie関係を使用して、指定された Baker エントリに関連付けられます。{ ... "externalReferenceCode" : "charlie-one", "id" : 47524, ... "r_bakerToCharlie_c_bakerERC" : "baker-one", "bakerToCharlieERC" : "baker-one", "name" : "Charlie 1", "r_bakerToCharlie_c_bakerId" : 47518 } { ... "externalReferenceCode" : "charlie-two", "id" : 47526, ... "r_bakerToCharlie_c_bakerERC" : "baker-one", "bakerToCharlieERC" : "baker-one", "name" : "Charlie 2", "r_bakerToCharlie_c_bakerId" : 47518 } { ... "externalReferenceCode" : "charlie-three", "id" : 47528, ... "r_bakerToCharlie_c_bakerERC" : "baker-one", "bakerToCharlieERC" : "baker-one", "name" : "Charlie 3", "r_bakerToCharlie_c_bakerId" : 47518 }これで、ベーカーというエントリに関連付けられたチャーリーのエントリが3つあり、そのベーカーのエントリ自体はエイブルというエントリに関連付けられています。 ただし、基本的なGETリクエストを使用してCharlieのエントリを照会した場合、レスポンスにはCharlieのエントリの詳細のみが含まれます。 関連するBaker社またはAble社の項目に関する詳細は含まれていません。 これらのエントリの詳細を返すには、
nestedFieldsおよびnestedFieldsDepthパラメーターを使用する必要があります。次のGETコマンドで使用するために、最初のエントリーのIDをコピーします。
-
Charlie エントリ ID をパラメータとして使用して、
Charlies_GET_ByIdを実行します。./Charlies_GET_ById.sh [charlieId]この GET リクエストは、
o/c/charliesエンドポイントをnestedFieldsおよびnestedFieldsDepthパラメータとともに呼び出します。
curl \
"http://localhost:8080/o/c/charlies/${1}/?nestedFields=ableToBaker,bakerToCharlie&nestedFieldsDepth=2" \
--user "test@liferay.com:learn"
nestedFields: クエリに含めるリレーションシップを決定します (ableToBaker,bakerToCharlie)。
nestedFieldsDepth: 含めるエントリの深さを決定します (2)。
このコマンドは、関連するオブジェクト(チャーリー、ベイカー、エイブル)の3つのレベルすべてを返します。
{
...
"externalReferenceCode" : "charlie-one",
"id" : 47524,
...
"r_bakerToCharlie_c_baker" : {
...
"externalReferenceCode" : "baker-one",
"id" : 47518,
...
"r_ableToBaker_c_able" : {
...
"externalReferenceCode" : "able-one",
"id" : 47512,
...
"name" : "Able 1"
},
"bakerToCharlie" : [ {
...
"externalReferenceCode" : "charlie-one",
"id" : 47524,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 1",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-two",
"id" : 47526,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 2",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-three",
"id" : 47528,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 3",
"r_bakerToCharlie_c_bakerId" : 47518
} ],
"name" : "Baker 1",
"ableToBaker" : {
...
"externalReferenceCode" : "able-one",
"id" : 47512,
...
"name" : "Able 1"
},
"r_ableToBaker_c_ableId" : 47512,
"r_ableToBaker_c_ableERC" : "able-one"
},
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlie" : {
...
"externalReferenceCode" : "baker-one",
"id" : 47518,
...
"r_ableToBaker_c_able" : {
...
"externalReferenceCode" : "able-one",
"id" : 47512,
...
"name" : "Able 1"
},
"bakerToCharlie" : [ {
...
"externalReferenceCode" : "charlie-one",
"id" : 47524,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 1",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-two",
"id" : 47526,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 2",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-three",
"id" : 47528,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 3",
"r_bakerToCharlie_c_bakerId" : 47518
} ],
"name" : "Baker 1",
"ableToBaker" : {
...
"externalReferenceCode" : "able-one",
"id" : 47512,
...
"name" : "Able 1"
},
"r_ableToBaker_c_ableId" : 47512,
"r_ableToBaker_c_ableERC" : "able-one"
},
"name" : "Charlie 1",
"r_bakerToCharlie_c_bakerId" : 47518
}
-
これらの ERC を使用して
Charlies_PUT_CharlieToAbles_ByExternalReferenceCodeを実行します。./Charlies_PUT_CharlieToAbles_ByExternalReferenceCode.sh charlie-one charlie-two charlie-three able-oneこれは、3 つの Charlie エントリすべてを、指定された
able-oneエントリに、charlieToAbleリレーションシップを使用して直接関連付けます。 -
AbleエントリのERCを使用して、
Ables_GET_ByExternalReferenceCodeを実行します。./Ables_GET_ByExternalReferenceCode.sh able-oneこの GET リクエストは、
o/c/ablesエンドポイントをnestedFieldsパラメータとともに呼び出します。
curl \
"http://localhost:8080/o/c/ables/by-external-reference-code/${1}?nestedFields=charlieToAble" \
--user "test@liferay.com:learn"
nestedFields: クエリに含めるリレーションシップを決定します (charlieToAble)。
このコマンドは、 able-one の詳細と、関連する 3 つの Charlie エントリのすべての詳細を返します。
{
...
"externalReferenceCode" : "able-one",
"id" : 47512,
...
"charlieToAble" : [ {
...
"externalReferenceCode" : "charlie-one",
"id" : 47524,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 1",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-two",
"id" : 47526,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 2",
"r_bakerToCharlie_c_bakerId" : 47518
}, {
...
"externalReferenceCode" : "charlie-three",
"id" : 47528,
...
"r_bakerToCharlie_c_bakerERC" : "baker-one",
"bakerToCharlieERC" : "baker-one",
"name" : "Charlie 3",
"r_bakerToCharlie_c_bakerId" : 47518
} ],
"name" : "Able 1"
}
IDでチャーリーをゲット!関連パン屋とエイブルズ
curl \
"http://localhost:8080/o/c/charlies/${1}/?nestedFields=ableToBaker,bakerToCharlie&nestedFieldsDepth=2" \
--user "test@liferay.com:learn"
関連するチャーリーズを含む外部参照コードで取得可能
curl \
"http://localhost:8080/o/c/ables/by-external-reference-code/${1}?nestedFields=charlieToAble" \
--user "test@liferay.com:learn"