entityQuery mit mehreren Bedingungen zu Taxonomiebedingungen gibt kein Ergebnis zurück


13

In meinem Anwendungsfall habe ich eine Entität mit zwei Feldern, die auf eindeutige Vokabulare verweisen.

Nachrichten: - Tag (Entitätsreferenz) - Kategorie (Entitätsreferenz)

Wenn ich nach einer dieser Referenzen frage, erhalte ich Ergebnisse, aber wenn ich beide abfrage (ein UND-Filter), erhalte ich keine Ergebnisse. Ich habe es jetzt dreifach überprüft und es gibt Entitäten, die sowohl das Tag als auch die Kategorie enthalten, die ich abfrage.

Handelt es sich um einen Benutzerfehler oder einen Drupal-Fehler?

$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();

BEARBEITEN: Ich habe eine Problemumgehung gefunden, indem ich den Rohwert anstelle von entity.value abgefragt habe. Dies ist jedoch eine unerwünschte Situation

$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();

Die Standard-Konjunktion für EQ ist AND (die Sie ändern können), damit nichts an der Gruppierung von Bedingungen falsch ist. Deshalb steht sie dort. Ich verstehe nicht, was Sie erwartet haben?

Antworten:


8

Der Grund, warum Sie dies nicht tun können, ist, dass beide Felder Entitätsreferenzen auf dieselbe Entität sind. Das heißt, die Basistabelle ist dieselbe Basistabelle.

Sie fordern Drupal auf, die taxonomy_data-Tabelle mit der Knotentabelle zu verknüpfen und eine unmögliche AND-Bedingung dafür zu erstellen.

PS

Sie können condition('field_tags', 1);anstelle von verwendencondition('field_tags', [1], 'IN');

Und wie in den Kommentaren erwähnt, ist die AND-Bedingungsgruppe die Standardeinstellung, sodass Sie sie nicht angeben müssen.

PPS

Bei beiden Bedingungen sollte die angegebene ID verwendet werden, um die Konsistenz zu gewährleisten.


1
Diese Antwort deckt nur eine naive Vorstellung davon ab, wie eine Entitätsabfrage funktionieren könnte. Es ist jedoch viel, viel leistungsfähiger. Überprüfe meine Antwort.

3

Eine wilde, ungetestete Vermutung:

$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'));

Wenn dies nicht funktioniert, finde mich nächste Woche im IRC # drupal-contrib und wir werden es zu Ende bringen.


Dies sollte in Drupal Core behoben werden, aber die obige Lösung funktioniert.
Mr.B

1

Eigentlich habe ich einen Hack dazu gefunden. Hier ist meine Erklärung dessen, was ich gefunden habe:

Ich hatte 3 Felder in meinem Inhaltstyp, die jeweils einen Verweis auf einen Taxonomiebegriff aus verschiedenen Vokabeln enthielten. Und ich wollte die Entitäten nach denjenigen abfragen, die in jedem dieser drei Felder (eine und eine Bedingung) einen bestimmten Taxonomiebegriff haben.

Ich habe die interne SQL-Abfrage überprüft, die nach mehreren Versuchen mit unterschiedlichen Kombinationen von Bedingungen erstellt wurde

[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))

Wie Sie sehen, hat es im Grunde keinen Bezug zu den tatsächlichen einzelnen Feldern, die dieses spezifische Vokabular verwenden. Mein Hack besteht also darin, so etwas wie Folgendes zu tun:

 $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');

Auch dies funktioniert, ich habe es getestet und es funktioniert als UND-Bedingung, die nur den Inhaltstyp mit diesen 3 Taxonomiebegriffen zurückgibt, selbst wenn die Verweise auf diese Taxonomiebegriffe in verschiedenen Feldern im Inhaltstyp gespeichert sind.

Ich bin nicht stolz auf den Hack, aber er funktioniert. Wenn dies also jemandem helfen kann, irgendwann zu sparen, probieren Sie es aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.