Puncte:2

Utilizarea API-ului de interogare de entități pentru a identifica entitățile cu valori corelate

drapel ai

Imaginează-ți două tipuri de entități personalizate Drupal 9 numite A și b.

Tip de entitate A are două câmpuri a_f1 și a_f2.

Tip de entitate b are un câmp b_a care este o referință de entitate cu un tip țintă de A și cardinalitate nelimitată.

Cum se creează o interogare de entitate care găsește toate entitățile de tip b dintre care cel puțin unul b_a referințe la entitate indică o A entitate care are valoarea „v1” pentru câmpul său a_f1 și valoarea „v2” pentru câmpul său a_f2?

Nu este potrivit în acest caz să găsiți un b care are o referință de entitate care indică un A entitate cu a_f1 de „v1” dar a_f2 a „altceva” și o altă referință la entitate care indică o altă entitate A entitate cu a_f2 de „v2” dar a_f1 de „valoare greșită”.

Aș putea face asta în somn cu interogări SQL directe, dar acest lucru este descurajat în lumea Drupal. Îmi este greu să găsesc îndrumări pentru a face acest lucru Calea Drupal în documentația oficială Drupal.

API-ul de interogare a entității Drupal acceptă această funcționalitate?

Puncte:3
drapel us

Următorul cod ar realiza ceea ce este descris în întrebare.

$rezultat = \Drupal::entityQuery('b')
  ->condition('b_a.entity:a.a_f1', 'v1')
  ->condition('b_a.entity:a.a_f2', 'v2')
  ->execute();

În primul șir trecut la condiție():

  • b_a este numele câmpului
  • .entitate:a spune că acel câmp este o referință de entitate pentru un A entitate
  • a_f1 și a_f2 sunt câmpuri pentru A entitate

Pentru mai multe informații despre valorile acceptate pentru prima condiție() argument, vezi QueryInterface::condition().

În cazul b_a câmpul este un câmp cu mai multe valori, ambele condiții s-ar referi la aceeași deltă, ceea ce înseamnă valoarea lui a_f1 și A_f2 câmpurile sunt preluate din același A entitate.
Codul pe care l-am scris la începutul răspunsului returnează toate entitățile pentru care sunt îndeplinite ambele condiții. Dacă doriți să obțineți toate entitățile pentru care una dintre condiții este adevărată, trebuie folosit următorul cod.

$interogare = \Drupal::entityQuery('b');
$grup = $interogare->sauConditionGroup()
  ->condition('b_a.entity:a.a_f1', 'v1')
  ->condition('b_a.entity:a.a_f2', 'v2');
$rezultat = $interogare->conditie($grup)->execute();
drapel ai
Minunat! Multumesc foarte mult. Se pare că nu am permisiunea pe acest site să-ți votez răspunsul sau aș face-o, dar l-am marcat ca răspuns corect (după crearea și testarea unui caz repro). Aceasta face exact ceea ce aveam nevoie să facă. Există pe undeva documentație care explică că API-ul se va asigura că ambele valori trebuie să provină de la aceeași entitate la care se face referire? Și explică cum să construiesc interogarea pentru cazul în care trebuie să găsesc entități `b` care fac referire la un `a` care are `a_f1 = 'v1'` **și** are un `a` unde `a_f2 = 'v2'` dar nu trebuie să fie aceleași entități `a`?
apaderno avatar
drapel us
Voi extinde răspunsul mâine (pentru mine este aproape miezul nopții), dar pot spune că pentru codul pe care l-am arătat, ambele condiții trebuie să fie adevărate pentru fiecare entitate returnată. Răspunsul nu ia în considerare un câmp cu mai multe valori, momentan.
drapel ai
Am confirmat (prin experimentare) că această abordare funcționează în același mod pentru câmpurile cu mai multe apariții cu valori multiple (valorile specificate trebuie să apară toate în aceeași apariție a câmpului pentru ca entitatea părinte să fie inclusă în rezultatele interogării). Dacă știți unde se ascunde documentația care explică toate acestea, vă rugăm să postați un link. Promit să fiu jenat dacă stă la vedere și l-am ratat. :-)
apaderno avatar
drapel us
Am extins răspunsul. Ceea ce spune documentația este că două condiții pentru același câmp multi-valoare se referă la aceeași deltă. înseamnă că prima condiție pentru `b_a.entity:a` nu se poate referi la primul articol, iar a doua condiție pentru `b_a.entity:a` la al treilea element.
drapel ai
O să ignor instrucțiunile de aici, care îmi spun să evit să postez comentarii „mulțumesc”. :-) Apreciez foarte mult informatiile pe care le-ati oferit, precum si linkul catre documentatie (pe care ar fi trebuit sa o gasesc singur). Și acum se pare că am obținut (prin postarea de comentarii) suficiente puncte de „reputație” pentru a vota răspunsul tău, ceea ce am făcut. Mulțumiri!
apaderno avatar
drapel us
Uneori, pagina de documentare mai evidentă nu este locul în care găsiți informațiile pe care le căutați. De aceea, uneori, nu ne uităm la asta. Mi s-a întâmplat și mie.

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.