nestedFieldsを使用して関連エントリをクエリする
ライフレイ 7.4 U69+/GA69+
nestedFields パラメータは、単一の GET リクエストで複数レベルの関連オブジェクト エントリを返します。 クエリに含めるリレーションシップ名を nestedFields パラメータに渡し、各リレーションシップをコンマで区切ります: nestedFields=[firstObjectRelationship],[secondObjectRelationship]。 関係が複数のレベルにまたがる場合は、 nestedFieldsDepth パラメータを必要な深さに設定します。 最大 5 つのレベルを含めることができます (例: nestedFieldsDepth=5)。
検索 パラメータ を使用して、複数レベルの ネストされたフィールド を検索すると、パフォーマンスに影響し、深さのレベルが追加されるごとにパフォーマンスが低下します。 複数レベルの関連オブジェクトを検索するには、クエリごとに 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名前 Baker3番目のオブジェクト:
項目 値 ラベル Charlie複数形のラベル Charlies名前 Charlie -
各オブジェクトのドラフトに
名前テキスト フィールドを追加します。ラベル 項目名 種類 必須 Namenameテキストボックス ✔ -
以下の関連を定義します。
エイブルの場合:
ラベル リレーション名 種類 オブジェクト 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 の [server]:[port]/o/api (例: localhost:8080/o/api)からカスタムオブジェクト API を表示およびテストできます。 REST アプリケーション をクリックし、API を選択します。
関連オブジェクトエントリの作成とクエリ
-
liferay-w4s7プロジェクトのcurlフォルダに移動します。cd liferay-w4s7/curl -
Ables_POST_ToCompanyを実行して、Able エントリを作成します。./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 }これで、Baker エントリに関連付けられた Charlie エントリが 3 つ作成され、Baker エントリ自体が Able エントリに関連付けられました。 ただし、基本的な 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 つのレベルすべて (つまり、Charlie、Baker、Able) を返します。
{
...
"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これは、
charlieToAble関係を使用して、3 つの Charlie エントリすべてを指定されたable-oneエントリに直接関連付けます。 -
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"
}
Charlies_GET_ById.sh
curl \
"http://localhost:8080/o/c/charlies/${1}/?nestedFields=ableToBaker,bakerToCharlie&nestedFieldsDepth=2" \
--user "test@liferay.com:learn"
Ables_GET_ByExternalReferenceCode.sh
curl \
"http://localhost:8080/o/c/ables/by-external-reference-code/${1}?nestedFields=charlieToAble" \
--user "test@liferay.com:learn"