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();
Antworten:
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.
quelle
Eine wilde, ungetestete Vermutung:
Wenn dies nicht funktioniert, finde mich nächste Woche im IRC # drupal-contrib und wir werden es zu Ende bringen.
quelle
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
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:
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.
quelle