Query su campo multivalore
Salve, ho una entità di contenuto con un campo multivalore. Attualmente attraverso il metodo 'IN' recupero i nodi che nel campo Multivalore hanno il dato che ricerco.
->condition( 'field_categorie' , $aCate , 'IN' ).
Espongo l'esigneza che ho adesso e spero di essere chiaro.
Per una categoria specifica, devo selezionare i nodi solo se il campo multivalore ha un solo movimento
Nel campo Multivalore ho vari Valori
Es. 1
A
B
C
Es. 2
D
S
E
A
B
Es. 3
B
Per la Categoria B mi serve selzionare solo i nodi che hanno la Categoria B ma solo se il campo multivalore ha quell'unico movimento
Quindi deve ritornarmi il nodo dell'esempio 3
Gaetano
Risposte
La pagina che ti avevo
La pagina che ti avevo postato qui:
http://www.drupal.it/supporto/databaseconnections#comment-13891
relativa alle conditions contiene info utili per costruire la query che ti serve:
<?php
\Drupal::entityTypeManager()
->getStorage('node')
->getQuery()
->condition('type', 'page')
->condition('status', 1)
->condition('field_categorie.%delta', 0) <----
->condition('field_categorie.%delta.target_id', 10) <-----
->accessCheck()
->execute();
?>
questa query ad esempio prende tutti i nodi pubblicati di tipo page a cui ha accesso l'utente anonimo per cui esiste esattamente un valore del campo multivalore field_categorie (in questo caso un entityreference) e tale valore è 10.
Grazie per la spiegazione
Grazie per la spiegazione Maurizio
Se ho capito bene, cambiando leggermente il codice in
->condition('field_categorie.%delta', 0, '=')
->condition('field_categorie.%delta.target_id', 10)
Mi riotrnerà unicamente i nodi che abbiano nel Primo Campo Multivalore l'ID 10
Se non sbaglio l'operatore di
Se non sbaglio l'operatore di default è già l'uguale (o IN in caso di passaggio di array come valore). Ad ogni modo è ok anche esplicitarlo.
Si, dovrebbe, perchè con
Si, dovrebbe, perchè con l'operatore > o < indica su quanti indici deve effettuare la ricerca.
Maurizio ne approfitto per un consiglio. L'indicazione che mi hai dato l'ho provata e sembra funzionare bene, La mia esigenza richiede un doppio richiamo della query .
Ho un modulo personalizzato e in una function richiamo la query
Ho la necessità nel primo richiamo di indcare la condition con il delta e nel secondo richiamo il metodo 'IN'.
Attualmente il tutto l'ho scritto così perchè all'interno della query non posso inserire una condizione
if ( $primaChiamata ) {
$q = $storage->getQuery()
->condition( 'type' , 'anagrafica_dipendenti' )
->condition( 'status' , 1)
->condition('field_abilitazioni.%delta', 0, '=')
->condition('field_abilitazioni.%delta', $aAbil[0] )
->sort('field_anagrafica', 'ASC') ;
} else {
$q = $storage->getQuery()
->condition( 'type' , 'anagrafica_dipendenti' )
->condition( 'status' , 1)
->condition( 'field_abilitazioni' , $aAbil , 'IN' )
->sort('field_anagrafica', 'ASC') ;
}
Vorrei fare un'unica chiamata alla query indicando i campi che a seconda della chiamata servono. Il campo che varia è 'field_abilitazioni'
Ho fatto varie prove ma nulla da fare
Con una struttura del genere
Con una struttura del genere perdi l'effettiva utilità delle query dinamiche. Puoi concatenare le condizioni in questo modo:
<?php
...
$q = $storage->getQuery();
if ($cond) {
$q->condition('field_uno', 1);
} else {
$q->condition('field_due', [2, 3]);
}
...
$results = $q->execute();
...
?>
Per maggiori info: https://www.drupal.org/docs/8/api/database-api/dynamic-queries/conditions
Grazie Maurizio, tramite il
Grazie Maurizio, tramite il tuo esempio ho apito l'errore che commettevo. Adesso tutto a posto