Puncte:2

EntityQuery unde câmpul cu mai multe valori conține o valoare

drapel de

Programez de 15 ani, 10 cu PHP, dar pe primul meu proiect Drupal. Folosind Drupal 9.

Încerc să recuperez o entitate (tip de conținut personalizat) care are 2 câmpuri de entitate cu valori multiple (utilizator). Dacă valoarea pe care o am este într-un câmp, vreau să-l primesc pe celălalt. Problema este că nu îmi pot da seama cum să cer entitatea când valoarea scalară pe care o am este în listă. Iată ce am:

returnează \Drupal::entityQuery('nod')
  ->condition('tip', 'relaţii_osj')
  ->condition('field_supervised_reps', [$userId], 'IN')
  ->execute();

Care generează acest SQL:

„SELECTARE „base_table”. „vid” AS „vid”, „base_table”. „nid” AS „nid”
DIN
„nod” „base_table”
INNER JOIN "node_field_data" "node_field_data" ON "node_field_data"."nid" = "base_table"."nid"
INNER JOIN "node__field_supervised_reps" "node__field_supervised_reps" ON "node__field_supervised_reps"."entity_id" = "base_table"."nid"
WHERE ("node_field_data"."type" = 'osj_relationships') ȘI ("node__field_supervised_reps"."field_supervised_reps_target_id" IN ('2458'))'

A doua parte a clauzei WHERE caută valoarea câmpului din parametrul meu. Am nevoie de el pentru a-mi căuta parametrul în câmp. Am încercat și CONTAINS, dar asta pare să presupună că valoarea câmpului este mai degrabă un șir decât o matrice. Dacă aș putea întoarce acea clauză WHERE, ar fi perfect. adică.

(('2458') ÎN "node__field_supervised_reps"."field_supervised_reps_target_id") 

Presupun că aș putea folosi „CONTAINS” dacă aș putea imploda lista de câmpuri, dar asta ar risca accesări false.

Orice sugestii?

Puncte:2
drapel in

Nici măcar nu trebuie să folosești ÎN aici, doar dacă ai mai multe $userIds, altfel va funcționa un operator simplu =:

returnează \Drupal::entityQuery('nod')
  ->condition('tip', 'relaţii_osj')
  ->condition('field_supervised_reps', $userId)
  ->execute();

Interogarea generată va funcționa de fapt așa cum doriți. Funcționează deoarece fiecare valoare a unui câmp cu mai multe valori este stocată în propriul rând în baza de date.

De exemplu, având în vedere un câmp de referință de entitate cu mai multe valori, field_tags, adăugat la nodurile articol, dacă aveți un articol (cu id = 111), care face referire la doi termeni de taxonomie cu id-urile 222 și 333, node__field_tags tabelul ar putea arăta astfel:

pachet șters entity_id revision_id langcode delta field_tags_target_id
articol 0 111 777 ro 0 222
articol 0 111 777 ro 1 333
Ed Coakley avatar
drapel de
Multumesc pentru raspuns. Am început să mă joc cu „în” și „conține” doar după ce „=” nu a funcționat. Pe lângă entityQuery(), am încercat și entityTypeManager(): returnează \Drupal::entityTypeManager() ->getStorage('nod') ->loadByProperties([ 'type' => 'osj_relationships', 'field_supervised_reps' => $userId ]); ...cu același rezultat (matrice goală). Am verificat că ținta pe care o caut este în baza de date și numele câmpurilor sunt corecte. Am încercat intval($userid) care, de asemenea, nu a schimbat nimic. Alte sugestii?
Ed Coakley avatar
drapel de
Ei bine, la o inspecție mai atentă, am descoperit o problemă de ortografie când am creat tipul de conținut. Ca întotdeauna, mașina proastă face ceea ce i se spune. 'osj_relationships' != 'osj_releationships' Uf. Îți mulțumesc că măcar ai validat că latră copacul potrivit.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.