entityQuery con più condizioni in termini di tassonomia non restituisce alcun risultato


13

Nel mio caso d'uso ho un'entità che ha due campi che fanno riferimento a vocabolari unici.

Novità: - tag (riferimento entità) - categoria (riferimento entità)

Se eseguo una query su uno di questi riferimenti, ottengo risultati tuttavia quando eseguo una query su entrambi (un filtro AND) non ottengo risultati. L'ho verificato tre volte e ci sono entità che contengono sia il tag che la categoria che sto interrogando.

Si tratta di un errore dell'utente o di un bug di 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();

EDIT: ho trovato una soluzione eseguendo una query sul valore non elaborato anziché entity.value. Questa è una situazione non desiderabile però

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

La congiunzione predefinita per l'EQ è AND (che puoi cambiare) quindi non c'è nulla di sbagliato nel raggruppare le condizioni insieme ... ecco perché è lì. Non capisco cosa ti aspettassi?

Risposte:


8

Il motivo per cui non è possibile farlo è che entrambi questi campi sono riferimenti entità alla stessa entità. Ciò significa che la tabella di base è la stessa tabella di base.

Stai chiedendo a Drupal di unire la tabella taxonomy_data alla tabella dei nodi e quindi creare una condizione AND impossibile su di essa.

PS

Puoi usare condition('field_tags', 1);invece dicondition('field_tags', [1], 'IN');

E come menzionato nei commenti, il gruppo di condizioni AND è l'impostazione predefinita, quindi non è necessario specificarlo.

PPS

È necessario che entrambe le condizioni utilizzino l'id di riferimento per essere coerenti.


1
Questa risposta copre solo un'immaginazione ingenua di come la query di entità potrebbe funzionare. È molto, molto più capace di questo, comunque. Controlla la mia risposta

3

Un'ipotesi selvaggia e non testata:

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

Se questo non funziona, trovami in IRC # drupal-contributo la prossima settimana e arriveremo alla fine.


Questo dovrebbe essere risolto in Drupal Core ma la soluzione sopra funziona.
Mr.B,

1

In realtà ho trovato un trucco per questo. ecco la mia spiegazione di ciò che ho trovato:

Avevo 3 campi nel mio tipo di contenuto ciascuno contenente un riferimento a un termine di tassonomia da diversi vocabolari. E volevo interrogare le entità per quelle che hanno un termine tassonomico specifico in ciascuno di quei 3 campi (una e condizione).

controllando la query SQL interna che viene prodotta dopo diversi tentativi con diverse combinazioni di condizioni, ho scoperto che

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

praticamente come puoi vedere, non ha alcun riferimento ai singoli campi reali usando quel vocabolario specifico, quindi il mio hack è fare qualcosa del genere:

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

di nuovo funziona, l'ho provato e funziona come una condizione AND che restituisce solo il tipo di contenuto con quei 3 termini di tassonomia anche se i riferimenti a tali termini di tassonomia sono memorizzati in diversi campi nel tipo di contenuto.

Non sono orgoglioso dell'hack ma funziona, quindi se questo può aiutare qualcuno a risparmiare qualche volta, provaci.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.