在分类条件上具有多个条件的entityQuery不返回结果


13

在我的用例中,我有一个实体,该实体具有两个引用唯一词汇表的字段。

新闻:-标签(实体参考)-类别(实体参考)

如果我查询其中一个引用,则会得到结果,但是当我同时查询两个(AND过滤器)时,不会得到结果。到目前为止,我已经对其进行了三重检查,并且有些实体同时包含我要查询的标签和类别。

这是用户错误还是Drupal错误?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category.entity.name', ['sport'], 'IN')
;
$query->condition($group);
$nids = $query->execute();

编辑:我通过查询原始值而不是entity.value找到了解决方法。虽然这是不希望的情况

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category', [1], 'IN')
;
$query->condition($group);
$nids = $query->execute();

EQ的默认连词为AND(您可以更改),因此将条件分组在一起没有任何问题...这就是它在那里的原因。我不明白你的期望吗?

Answers:


8

您无法执行此操作的原因是,这两个字段都是对同一实体的实体引用。这意味着基表是相同的基表。

您要让Drupal将taxonomy_data表加入到节点表,然后对其进行不可能的AND条件。

聚苯乙烯

您可以使用condition('field_tags', 1);代替condition('field_tags', [1], 'IN');

并且如注释中所述,AND条件组是默认条件,因此您无需指定它。

PPS

您应该让两个条件都使用引用的ID来保持一致。


1
这个答案仅涵盖了实体查询如何工作的幼稚想象力。但是,它的功能要强大得多。检查我的答案。

3

一个未经测试的疯狂猜测:

$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'news');

$query = $query->condition($query->andConditionGroup()->condition('field_tag.entity.name', ['cars'], 'IN'))
  ->condition($query->andConditionGroup()->condition('field_category.entity.name', ['sport'], 'IN'));

如果这不起作用,那么下周在IRC#drupal-contribute中找到我,我们将结束它。


这应该在Drupal Core中修复,但是上面的解决方案有效。
Mr.B

1

实际上,我发现了这一点。这是我对发现的内容的解释:

我的内容类型中有3个字段,每个字段都引用了来自不同词汇的分类术语。我想查询实体,以查找在这3个字段(和条件)中每个字段中都有特定分类法术语的实体。

检查使用不同条件组合几次尝试后产生的内部SQL查询,我发现

[Previous conditions] AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_2)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_3)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_4))

基本上如您所见,它没有使用该特定词汇表来引用实际的各个字段,因此我的技巧是执行以下操作:

 $query = \Drupal::entityQuery('node')
            ->condition('status', '1')
            ->condition('type', $content_type_machine_name)
            ->condition('field_holding_term_ref.entity.name', array($label_of_term_in_field1, $label_of_term_in_field2, $label_of_term_in_field3), 'IN');

再次有效,我已经对其进行了测试,并且它作为AND条件,仅返回具有这三个分类术语的内容类型,即使这些分类术语的引用存储在内容类型的不同字段中。

我不为骇客感到自豪,但它确实有效,因此,如果这可以帮助某人节省时间,那就去做吧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.