複数のカテゴリー関係基準(and)と(or)

カテゴリが(aまたはb)で(cまたはdまたはe)のrelatedToカテゴリを実行する方法はありますか?

私は(aまたはb)を使って働くことができます:

{% paginate craft.commerce.products.relatedTo(categories).limit(20) as pageInfo, products %}

私は別々に(aとb)を使って働くことができます:

{% set relationParam = ['and', { sourceElement: product }] %}
{% for category in categories %}
    {% set relationParam = relationParam|merge([{ targetElement: category }]) %}
{% endfor %}
{% paginate craft.commerce.products.relatedTo(relationParam).limit(20) as pageInfo, products %}

I need to combine these though as I am working with 3 category
groups for filtering and want to match products where it is related
to any of the selected categories in group 1, and any of the
selected categories in group 2, and any of the selected categories
in group 3.

選択の例は次のようになります:

グループ1:エッセンシャル、パール

グループ2:C6

グループ3:レッド、グリーンズ

‘or’構文を使用すると、それぞれのグループで一致しなくなったあまりにも多くの結果が得られます。また、
‘and’構文を使用すると制約が厳しくなり、選択したすべてのカテゴリが製品に必要になります。誰がどのように私が必要なものを得るために、関連する基準をそのような方法で入れ子にすることができるかを知っていますか?

私は次のように使ってみましたが、何の結果も得られませんでした。

{% set relationParam = ['and'] %}
{% if rangeCategories|length %}
    {% set rangeParam = ['or'] %}
    {% for category in rangeCategories %}
        {% set rangeParam = rangeParam|merge([{ targetElement: category }]) %}
    {% endfor %}
    {% set relationParam = relationParam|merge(rangeParam) %}
{% endif %}
{% if sizeCategories|length %}
    {% set sizeParam = ['or'] %}
    {% for category in sizeCategories %}
        {% set sizeParam = sizeParam|merge([{ targetElement: category }]) %}
    {% endfor %}
    {% set relationParam = relationParam|merge(sizeParam) %}
{% endif %}
{% if colourCategories|length %}
    {% set colourParam = ['or'] %}
    {% for category in colourCategories %}
        {% set colourParam = colourParam|merge([{ targetElement: category }]) %}
    {% endfor %}
    {% set relationParam = relationParam|merge(colourParam) %}
{% endif %}
{% paginate craft.commerce.products.relatedTo(relationParam).limit(20) as pageInfo, products %}

私は ‘と’
‘または’の両方の構文を使用する人の例は見ていませんでした。ドキュメントに関するこれに関するメモはありません。ありがとうございました。

ベストアンサー

あなたが望むのは、(aまたはbに関連する製品)と(c、d、またはeに関連する製品)の和集合です。

これらのより複雑なクエリを実行する良い方法の1つは、 ids
のセットを構築することです。それに基づいて最終的なクエリを実行します。

したがって、aまたはbに関連する商品のIDを取得します。

{% set aOrBProductIds = craft.commerce.products({
    relatedTo: aOrBCategories,
    limit: null
  }).ids()
%}

c、d、またはeに関連する製品のID:

{% set cOrDorEProductIds = craft.commerce.products({
    relatedTo: cOrDorECategories),
    limit: null
  }).ids()
%}

これらの配列をすべてのIDを持つ1つの配列にマージする:

{% set productIds = aOrBProductIds | merge(cOrDorEProductIds) %}

最後に、製品を入手して改ページします。

{% set productsToPaginate = craft.commerce.products.id(productIds) %}
{% paginate productsToPaginate.limit(20) as pageInfo, products %}

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です