Eseguire una query con una condizione del campo entità con più valori


14

Ho un tipo di contenuto che ha un campo di riferimento dell'entità che consente agli utenti di aggiungere più termini di tassonomia in quel campo. Sto tentando di eseguire query che catturano nodi con un insieme specifico di termini di tassonomia all'interno di quel campo.

L'uso di un valore in quel campo funziona bene, in questo modo.

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', 2)
        ->sort('field_last_name', DESC);

Dove 2 è l'id del termine che sto cercando. Tuttavia, quando provo a cercare nodi che contengono due termini specifici in questo modo,

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8])
        ->sort('field_last_name', DESC);

Ricevo l'errore

Numero parametro non valido: il numero di variabili associate non corrisponde al numero di token:

Ho anche provato

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8], 'IN')
        ->sort('field_last_name', DESC);

Il che non fallisce, ma non fornisce i risultati previsti. Visualizza tutti i nodi che hanno il termine 2 O il termine 8. Invece del termine 2 E il termine 8 come previsto. Come eseguirò una query che controlla se un nodo ha più valori specifici in un campo di riferimento dell'entità?

Risposte:


19

Usa due separati andConditionGroup():

$query = \Drupal::entityQuery('node')
  ->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type');
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 2);
$query->condition($and);
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 8);
$query->condition($and);
$result = $query->execute();

Funziona indipendentemente da quanti termini ci siano nel campo o in quale delta siano.

modificare

Ciò si traduce in questo SQL:

SELECT base_table.vid AS vid, base_table.nid AS nid
FROM 
{node} base_table
INNER JOIN {node_field_data} node_field_data ON node_field_data.nid = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy ON node__custom_taxonomy.entity_id = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy_2 ON node__custom_taxonomy_2.entity_id = base_table.nid
WHERE  (node_field_data.status = '1') AND (node_field_data.type = 'custom_type') AND( (node__custom_taxonomy.custom_taxonomy_target_id = '2') )AND( (node__custom_taxonomy_2.custom_taxonomy_target_id = '8') )

Ha provato un codice equivalente sopra e non ha restituito alcun valore, hai verificato che questo codice funzioni?
Eyal,

Sì, funziona per l'articolo standard e il campo tag riempito con più tag.
4k4

Forse il mio suggerimento è fallito perché l'ho scritto in questo modo $and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
Eyal

3
Non importa, appena provato, funziona 'IN'anche con . Ciò che fa la differenza sono i due gruppi AND separati.
4k4,

3
Bello, non sapevo che funzionasse. Ha senso, poiché questo forza più join internamente.
Berdir,

8

Per eseguire query complesse come richiesto, è necessario utilizzare un gruppo di condizioni e interrogare il delta.

$query = \Drupal::entityQuery('node');
$query->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type')
  ->condition('custom_taxonomy', [2, 8], 'IN')
  ->condition('custom_taxonomy.%delta', 2, '=')
  ->sort('field_last_name', DESC);
$or = $query->orConditionGroup();
$or->condition('custom_taxonomy.0.target_id', 2);
$or->condition('custom_taxonomy.0.target_id', 8);
$query->condition($or);

Vedere la documentazione di QueryInterface :: condition .


1
Ho implementato la risposta, ma per qualche motivo non mostra i risultati corretti. Se uso solo uno dei $ e delle condizioni, come [2], 'IN' o [8], 'IN' visualizza i risultati bene, ma quando uso entrambi, non ottengo alcun risultato. Ho controllato tre volte per assicurarmi di avere nodi che hanno entrambi.
Matt,

1
Pensandoci, non è necessario per AND conditionGroup perché entityQuery utilizza AND per impostazione predefinita.
Eyal,

1
Va bene l'ho cambiato in solo usando $ query-> condition () ma sto ancora avendo il problema che quando si usano entrambi non mostra alcun risultato.
Matt,

1
Secondo la documentazione di QueryInterface :: condition è possibile applicare condizioni sul delta. Aggiornerò la risposta con un codice di esempio.
Eyal,

1
@Eyal, il gruppo di condizioni AND sembra essere ridondante, ma aiuta davvero a specificare più condizioni per lo stesso campo. Hai solo bisogno di mettere ogni condizione in un gruppo AND separato.
4k4

1
$taxonomy_term = 'taxonomy_term';
    $vid = 'name_taxon';
    $terms = $this->entity_type_manager->getStorage($taxonomy_term)
      ->loadTree($vid);

foreach ($terms as $term) {
  $term_data[] = [
    "vid" => $term->vid,
    "name" => $term->name,
  ];
}
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.