#StackBounty: #json How do you correctly filter on taxonomy terms to get all nodes matching term or parent term?

Bounty: 50

I have a vocabulary (channel) with two levels. An article node can be added to the first or second level (via field_channel). The hierarchy looks like:

  • channel-1
    • subchannel-1.1
    • subchannel-1.2
    • subchannel-1.3
  • channel-2 (i.e. [node/1, node/2])
    • subchannel-2.1 (i.e. [node/4, node/5])
    • subchannel-2.2 (i.e. [node/6])

I want to filter all nodes that belongs to a term of level 1 (the ones which where assigned directly to the term and the ones which where assigned to one of its child terms).

In other words, filtering all nodes for a given channel (i.e. channel-2) should contain the nodes assigned to that channel directly and all nodes assigned to a sub-channel whose parent channels is that channel. In the example all nodes from 1 to 6.

The JSON:API request looks like:

{{base_url}}/node/article?
include=field_channel,field_channel.parent&
fields[node--article]=title,field_channel&
fields[taxonomy_term--channel]=name,parent&
filter[or-group][group][conjunction]=OR&
filter[channel][condition][path]=field_channel.name&
filter[channel][condition][value]=channel-2&
filter[channel][condition][memberOf]=or-group&
filter[channel-parent][condition][path]=field_channel.parent.name&
filter[channel-parent][condition][value]=channel-2&
filter[channel-parent][condition][memberOf]=or-group    

I don’t see the error, but it only contains the nodes matching the channel-parent condition. If I remove that condition, the ones matching the channel condition are there. What is wrong with the request.

I also tried the short form:

{{base_url}}/node/article?
fields[node--article]=title,field_channel&
include=field_channel,field_channel.parent&
fields[taxonomy_term--channel]=name,parent&
filter[or-group][group][conjunction]=OR&
filter[field_channel.name][value]=channel-2&
filter[field_channel.name][memberOf]=or-group&
filter[field_channel.parent.name][value]=channel-2&
filter[field_channel.parent.name][memberOf]=or-group

Which gives me an error in the where clause (the empty group at the beginning):

WHERE (() and (taxonomy_term_field_data.name LIKE :db_condition_placeholder_0 ESCAPE ‘\’)

BTW: The example could be easily build by using the drupal thunder distribution.


Get this bounty!!!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.